为什么 Option<bool> 的大小等于 1?

drc*_*ole 4 size rust

Rust Playground上, an 的大小Option<bool>是 1。 Rust 是否将选项信息打包到 bool 本身中?所以 Option 代表 3 种可能的状态:None, Some(false), Some(true)?

use std::mem::size_of;

fn main() {
    println!("{}", size_of::<Option<bool>>()); // 1
}
Run Code Online (Sandbox Code Playgroud)

Cha*_*man 8

是的。这称为利基优化。bool有7 位(7 个未使用的位)的利基,我们将Option::None其装入其中。

您可以检查字节(playground):

fn main() {
    fn print_bytes(v: Option<bool>) {
        println!("{:08b}", unsafe { std::mem::transmute::<Option<bool>, u8>(v) });
    }
    print_bytes(Some(false));
    print_bytes(Some(true));
    print_bytes(None);
}
Run Code Online (Sandbox Code Playgroud)
00000000
00000001
00000010
Run Code Online (Sandbox Code Playgroud)

你可以看到我们用第二位来表示None

请注意,正如 @Cerberus 的评论中所述,#[repr(rust)]类型的内存布局不得到保证,因此不应依赖它。

  • 但请注意,不能保证准确的实现,因此不应手动检查该位并依赖结果来确保正确性。 (2认同)