2013-05-12 10 views
51

は、参照は、nullになることはありません単純なポインタと比較して割付と参照解除の手順は? Optionを、同じenum構造を使用して非コアライブラリで自分でOptionを実装する場合よりもコストをかけることなく、またはベクトルにポインタをラップすることによって、コストがかからないようにコンパイラ/ランタイムにいくつかの「魔法」がありますか?Rust's Optionのオーバーヘッドは何ですか?</p> <pre><code>struct Element { value: i32, next: Option<Box<Element>>, } </code></pre> <p>どのくらいのオーバーヘッドは、メモリの面で、この中に関与している:あなたは、実際に、このようなリンクリストとして、ヌル必要がある場合には、あなたが<code>Option</code>型を使用するので、錆に

答えて

55

はい、Option<ptr>を単一のポインタ(ほとんどの場合)に最適化するコンパイラマジックがあります。 (ポインタが8バイトであるので、64ビットマシン上で)

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>>); 
} 

以下のサイズが印刷されている:

// 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 

&i32Box&[i32]Vec<i32>全てが非NULL可能ポインタを使用することOption内の最適化!

+17

さらに、この最適化はすべての「オプション」風の列挙型で行われるため、ユーザー定義の 'Option'でも動作します。 –

6

この回答は廃止されました。可能であればOption<T>の判別式が最適化されました。今のところ(提供された情報の残りの部分は、しかし、依然として興味深い。)

Optionタイプは他enum型より空間の同じ量を占めます。私は詳細を知らないが、それは確かにある種の差別化された組合として表される。

最適化のために内部表現を微調整する可能性は、Rust開発者によって検討されています。ここで

はパトリック・ウォルトンによって掲示 relevant discussion on the dev mailing list、次のとおりです。

ここでは、コンパイラの最適化のための部屋がたくさんありますので、私は、 列挙型の特定のビット表現にコミットすることを躊躇ビットです。 例えば、我々はNULL可能 ポインタにOption<~int>を崩壊することをお勧めします、我々はNULL可能 文字列にResult<(),~str>を崩壊する場合があります、または私達は は、文字列は、トップ256バイトを占有することはできませんと仮定し、1つのワードにEither<u8,~str>を崩壊する場合がありますアドレス空間の 私はしばらくの間、おそらく には、錆の列挙型のビットパターンが指定されていないと言って、 にできるだけ多くの部屋を最適化して遊ばせると思っていました。

+1

これは間違っています。あなたが言及した最適化は(実装されている)(いくつかの)(https://github.com/mozilla/rust/pull/6001)。 – huon

+1

これはRustの現在のリリース版では正しいと言ったようです:-) – barjak

関連する問題

 関連する問題