Rust似乎在内存中为一个布尔数组分配了相同的空间作为一个8位整数数组

时间:2018-02-19 22:40:10

标签: rust

正在运行this code in rust

fn main() {
    println!("{:?}", std::mem::size_of::<[u8; 1024]>());
    println!("{:?}", std::mem::size_of::<[bool; 1024]>());
}
  

1024

     

1024

这不是我的预期。所以我编译并在发布模式下运行。但我得到了同样的答案。

为什么rust编译器似乎为每个布尔值分配一个完整的字节?对我来说,似乎只是一个简单的优化,只分配128个字节。 This project意味着我不是第一个想到这一点。

这是编译器比看起来更难的情况吗?或者这不是优化的,因为它不是一个现实的场景?或者我在这里不明白?

1 个答案:

答案 0 :(得分:5)

指针和参考

  1. 假设您始终可以引用切片的项目,结构的字段等...
  2. 在语言中假设对静态大小类型的实例的任何引用都可以转换为类型擦除指针*mut ()
  3. 这两个假设一起意味着:

    • 由于(2),不可能创建一个&#34;位参考&#34;这将允许子字节寻址,
    • 由于(1),不可能没有参考。

    这实质上意味着任何类型必须具有一个字节的最小对齐。

    请注意,这不一定是个问题。选择128字节表示应该谨慎,因为这意味着交换速度(和方便)的内存。这不是纯粹的胜利。

    现有技术(在C ++中以std::vector<bool>的名义)被广泛认为是事后的错误。