根据Rust参考:
该
isize类型是带符号的整数类型,其位数与平台的指针类型相同.对象和数组大小的理论上限是最大值isize.这确保了isize可以用于计算指向对象或数组的指针之间的差异,并且可以解决对象内的每个字节以及超过结尾的一个字节.
这显然将数组限制在32位系统上的最多2G元素,但是不清楚的是数组是否也被限制为最多2GB的内存.
在C或C++中,您可以将指针转换为第一个和最后一个最后一个元素,char*并从这两个元素中获取指针的差异; 有效地将阵列限制为2GB(以免它溢出intptr_t).
在Rust中,32位数组是否也限制为2GB?或不?
内部Vec确实将值限制为4GB,包括with_capacity和grow_capacity,使用
let size = capacity.checked_mul(mem::size_of::<T>())
.expect("capacity overflow");
Run Code Online (Sandbox Code Playgroud)
如果指针溢出会发生混乱.
因此,Vec分配的切片也以这种方式封装在Rust中.鉴于这是因为分配API的基本限制,如果任何典型类型可以绕过这一点,我会感到惊讶.如果他们这样做,Index由于指针溢出,在切片上将是不安全的.所以我希望不是.
但是,由于其他原因,可能仍然无法分配所有4GB.特别是,allocate不会让你分配超过2GB(isize::MAX字节),因此Vec仅限于此.
| 归档时间: |
|
| 查看次数: |
1598 次 |
| 最近记录: |