Rust数组可以包含几个元素?

Hel*_*rld 5 rust

这段代码给了我一个错误:

fn main() {
    let x = [0 as u64; std::u64::MAX as usize];
    println!("Hello, world! {}", std::u64::MAX);
}
Run Code Online (Sandbox Code Playgroud)
fn main() {
    let x = [0 as u64; std::u64::MAX as usize];
    println!("Hello, world! {}", std::u64::MAX);
}
Run Code Online (Sandbox Code Playgroud)

She*_*ter 9

数组长度isizetype 约束,type是平台大小的整数:

isize类型是带符号的整数类型,其位数与平台的指针类型相同。对象和数组大小的理论上限是最大值isize。这样可确保isize可用于计算指向对象或数组的指针之间的差异,并可寻址对象中的每个字节以及末尾的一个字节。

  • 16位平台:2的最大值15 - 1
  • 32位平台:2的最大值31 - 1
  • 64位平台:2的最大值63 - 1
fn main() {
    let x = [(); std::isize::MAX];
    println!("Hello, world! {}", x.len());
}
Run Code Online (Sandbox Code Playgroud)

您的特定错误是因为在元素大小为非零时构造这么多元素的数组将需要大量内存,而不是给定平台实际支持的内存。

数组的大小是通过元素的大小乘以元素计数来计算的。您的数组具有类型u64(8个字节)的元素,并尝试具有2 64-1个元素,总计147.6艾字节。

在带有Rust 1.38的64位Linux上,最大大小似乎为2 47-1

[0u8; (1usize << 47) - 1];
Run Code Online (Sandbox Code Playgroud)

  • “在带有Rust 1.38的64位Linux上,最大大小似乎是2⁴⁷-1:”,而您将能够*编译*这样的程序,它将立即在任何实际计算机上进行段错误处理,因为这仍然是1PB的PB。记忆。 (2认同)
  • [此Nomicon章节](https://doc.rust-lang.org/nomicon/vec-alloc.html)提到“因此,我们必须将所有分配限制为`isize :: MAX`元素”。我认为还有一些更细微的限制。该章提到了许多有关分配限制的细节。 (2认同)
  • FWIW,之所以使用2 ^ 47而不是2 ^ 48是因为地址空间是不连续的,与`isize` /`usize`问题无关(仅当您可以使用整个地址空间时才需要担心)。[规范的地址](https://en.m.wikipedia.org/wiki/X86-64#Virtual_address_space_details) (2认同)