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

and*_*oot -1 rust

在rust中运行此代码:

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

1024

1024

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

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

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

Mat*_* M. 5

指针和参考.

  1. 假设您始终可以引用切片的项,结构的字段等...
  2. 在该语言中存在一种假设,即对静态大小类型的实例的任何引用都可以转换为类型擦除指针*mut ().

这两个假设一起意味着:

  • 由于(2),不可能创建一个允许子字节寻址的"位参考",
  • 由于(1),不可能没有参考.

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


请注意,这不一定是个问题.选择128字节表示应该谨慎,因为这意味着对内存的速度(和便利性)进行折衷.这不是纯粹的胜利.

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