`usize` 和 `u32` 有什么区别?

133

文档表示usize类型是

提供操作和常量用于指针大小的无符号整数。

在大多数情况下,我可以将usize替换为u32而不会有任何变化。因此我不明白为什么我们需要两个如此相似的类型。

2个回答

198
警告:此答案是针对Rust的旧版本,usize已被重新定义为“可以保存任何内存位置”,详见95228以获取更深入的解释,简而言之:指针不仅仅是一个数字。
根据文档所述, usize的大小取决于您编译程序的架构,因为它与指针大小相同。
举个例子,在32位x86计算机上,usize = u32,而在x86_64计算机上,usize = u64usize保证足够大,可以容纳任何指针或数据结构中的任何偏移量,而u32在某些架构上可能太小。

7
为了保证安全,我是否应该始终使用 usize 类型? - Vayn
29
取决于你想做什么,如果是将索引保存在内存结构中,那么可以使用。对于普通数字,u32通常很好。标准库始终在适当的情况下使用usize,而Rust不会自动将u32转换为usize,因此您将在需要时看到它们的区别。 - Levans
7
如果您正在处理嵌入式系统,那么 u32 可能也过大。Rust 作为一种系统语言,设计得可以很好地处理这种情况。如果 u32 总是太小,那么该语言可能会被设计成将 u32 静默转换为 usize - Nicholas Pipitone
7
请注意,如果您关心确定性行为或序列化,usize可能会导致混淆。 - Kostas Kryptos
@NicholasPipitone 可能不像 u8 不能静默转换为 u16。但如果提供了 into() 而不仅仅是 try_into(),那就更好了。 - Chayim Friedman
@ChayimFriedman 是的,这更精确。如果 u32 被保证为 <= usize(没有嵌入式系统),那么将会提供 into() 而不是静默转换。但我们都没有,因为 usize 可以是 8 位、16 位、32 位、64 位,任何东西。~ - Nicholas Pipitone

15

补充@Levans的回答,

usize 的大小取决于引用内存中任何位置所需的空间大小。

在32位目标上,usize为4个字节,在64位目标上,usize为8个字节。


1
这个答案与@Levans的答案有何不同? - ynn
1
我认为这个答案是对@Leavans答案的补充。根据Rust文档,usize是一个指针大小的整数,这意味着它与u32的另一个区别是,根据这个答案。 - Yuchen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接