< 返回版块

SunApriloy 发表于 2021-02-05 10:23

Tags:rust数据类型,usize

像str类型,pub const fn len(&self) -> usize,len方法会返回usize; 像迭代器,fn nth(&mut self, n: usize) -> Option<Self::Item>,nth方法接受usize作为参数。 这样的设计意义何在?为什么不直接使用u32或u64呢,比如像整数类型的pow方法只会接受u32作为参数?

评论区

写评论
Aya0wind 2021-02-05 11:32

usize指该平台上理论上内存对象的最大大小,一般就是指指针能表示的地址空间。是一个与程序位数,平台都相关的类型,毕竟不同平台的指针从8位到64位都可以有。C++里也有个size_t,各种容器返回的大小就是size_t,跟usize是一样的。 不过这种设计在现在看来有点多余了,32位大小基本上是用不完的(很少存单个好几个G的对象)。所以因为使用int默认大小而溢出错误的可能性极低。然后由于标准库用的无符号,大家写代码却常用有符号,经常就是直接for(int i=0balabala,然后C++允许隐式转换,特别是用泛型的时候,使用的时候如果没注意类型,在循环的时候容易把无符号当有符号用,出现减到0溢出的情况,反倒比大小溢出更容易出问题。所以C++在20标准加了个std::ssize,允许自动转换为有符号的大小。 Rust则是直接官方要求你都用usize,而且不允许隐式转换,提醒你要注意类型,各种迭代都是推荐用usize的,比C++要统一,所以也不提供有符号的了,就是有时候必须要转成有符号要显式转换一下。

Neutron3529 2021-02-05 11:23

强制usize是为了防止写程序时候出BUG的

就比如C++里,你很有可能写出类似for(auto i=vec.size()-1;i>=0;i--)这样的死循环(size返回一个unsigned类型的数据,auto推断时候自动把i写成unsigned,这样的数据一定大于等于0,也就形成了死循环)

如果约定一致,不会出现类似的BUG

Mike Tang 2021-02-05 11:08

就像c、c++中的 int, uint,一样用得很多。

gwy15 2021-02-05 10:47

usize 大小跟平台有关,如果是 u32 在 64 位平台就没法覆盖全部寻址空间

1 共 4 条评论, 1 页