What is the overhead of Rust's Option type?

前端 未结 1 373
梦毁少年i
梦毁少年i 2020-11-27 05:13

In Rust, references can never be null, so in case where you actually need null, such as a linked list, you use the Option type:

struct Element {         


        
相关标签:
1条回答
  • 2020-11-27 05:57

    Yes, there is some compiler magic that optimises Option<ptr> to a single pointer (most of the time).

    use std::mem::size_of;
    
    macro_rules! show_size {
        (header) => (
            println!("{:<22} {:>4}    {}", "Type", "T", "Option<T>");
        );
        ($t:ty) => (
            println!("{:<22} {:4} {:4}", stringify!($t), size_of::<$t>(), size_of::<Option<$t>>())
        )
    }
    
    fn main() {
        show_size!(header);
        show_size!(i32);
        show_size!(&i32);
        show_size!(Box<i32>);
        show_size!(&[i32]);
        show_size!(Vec<i32>);
        show_size!(Result<(), Box<i32>>);
    }
    

    The following sizes are printed (on a 64-bit machine, so pointers are 8 bytes):

    // As of Rust 1.22.1
    Type                      T    Option<T>
    i32                       4    8
    &i32                      8    8
    Box<i32>                  8    8
    &[i32]                   16   16
    Vec<i32>                 24   24
    Result<(), Box<i32>>      8   16
    

    Note that &i32, Box, &[i32], Vec<i32> all use the non-nullable pointer optimization inside an Option!

    0 讨论(0)
提交回复
热议问题