RustにおけるOptionの最適化

ネタ元: performance - What is the overhead of Rust's Option type? - Stack Overflow

Rustにはnull値がなく、代わりにOptionを使う。このOptionは、ポインタ型に対しては最適化されるそうだ。

確認してみる。(rustc 0.10を使った。)

use std::mem::size_of;

#[deriving(Eq, Clone)]
enum Maybe<T> {
    Nothing,
    Just(T),
}

fn main() {
    println!("size of int         : {}", size_of::<int>());
    println!("size of ~int        : {}", size_of::<~int>());
    println!("size of Option<int> : {}", size_of::<Option<int>>());
    println!("size of Option<~int>: {}", size_of::<Option<~int>>());
    println!("size of Maybe<int>  : {}", size_of::<Maybe<int>>());
    println!("size of Maybe<~int> : {}", size_of::<Maybe<~int>>());
}

実行結果:

size of int         : 8
size of ~int        : 8
size of Option<int> : 16
size of Option<~int>: 8
size of Maybe<int>  : 16
size of Maybe<~int> : 8

Option<int>と異なり、Option<~int>のサイズは~intと変わらないことがわかる。また、この最適化は別に定義されたMaybeに対しても働いているようだ。