2013-05-12 70 views
51

生鏽,引用不能爲空,所以在情況下,你確實需要空,如鏈接列表,您可以使用Option類型:Rust的選項類型的開銷是多少?

struct Element { 
    value: i32, 
    next: Option<Box<Element>>, 
} 

多少開銷參與這一在內存方面分配和步驟解引用相比,一個簡單的指針?在編譯器/運行庫中有沒有一些「魔力」可以使得Option免費,或者比使用相同enum構造的非核心庫本身實現Option更便宜,或者成本更低,或者通過將指針包裝在向量中?

回答

55

是的,有一些編譯器魔術可以優化Option<ptr>到單個指針(大部分時間)。

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

以下尺寸被打印(64位機器上,所以指針是8個字節):

// 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>全部使用非可空指針在Option內優化!

+17

此外,這種優化發生在所有類似「Option」的枚舉中,所以它也適用於用戶定義的Option。 – 2013-05-13 20:04:26

6

此答案現在已過時;在可能的情況下,Option<T>中的判別式現在被優化。(所提供的信息的其餘部分仍然是有趣,雖然。)

現在,一個Option型佔據的空間相同量的比任何其他enum類型。我不知道具體情況,但它確實代表某種有區別的工會。

Rust開發人員正在考慮調整內部表示以進行優化的可能性。

這裏是一個relevant discussion on the dev mailing list,張貼由帕特里克·沃爾頓:

我有點猶豫承諾的 枚舉特定位表示,因爲有大量的空間,在這裏編譯器的優化。對於 例如,我們可能要崩潰了Option<~int>成一個可空 指針,我們可能要崩潰了Result<(),~str>成一個可空 字符串,或者我們可能要崩潰了Either<u8,~str>到1個字, 假設弦永遠不能佔據前256個字節地址空間的 。我想了一會兒,也許最好 只是說,Rust枚舉的位模式是未指定的,給我們儘可能多的空間來優化。

+1

這是不正確的。 (一些)你提到的優化已經[實施](https://github.com/mozilla/rust/pull/6001)。 – huon 2013-05-13 05:45:32

+1

好吧,就像你說的這是正確的當前發佈版本的Rust :-) – barjak 2013-05-13 15:20:28