2013-05-12 6 views
51

는, 참조는 null이 될 수 없다 간단한 포인터와 비교할 때 할당 및 참조 해제 단계가 필요합니까? Optionenum 구조체를 사용하여 비 핵심 라이브러리에서 Option을 직접 구현하거나, 벡터에 포인터를 래핑하는 것보다 Option을 비용 부담이 적게 드는 "마법"이 있습니까? ?Rust 's Option 유형의 오버 헤드는 무엇입니까?</p> <pre><code>struct Element { value: i32, next: Option<Box<Element>>, } </code></pre> <p>얼마나 많은 오버 헤드 메모리의 측면에서이에 참여하고있다 : 당신이 실제로 링크리스트와 같은, null을해야 할 경우, 당신은 <code>Option</code> 유형을 사용할 수 있도록 녹에서

답변

55

예, 대부분의 경우 Option<ptr>을 단일 포인터로 최적화하는 일부 컴파일러 마법이 있습니다. &i32Box&[i32], Vec<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 

참고한다 :

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

다음 크기

는 (포인터는 8 바이트이다, 그래서, 64 비트 시스템에서) 인쇄 Option 내부의 최적화!

+17

또한,이 최적화는 모든 "옵션"과 같은 "enums"에서 발생하므로 사용자 정의 된'Option'에도 적용됩니다. –

6

이 답변은 현재 사용되지 않습니다. Option<T>의 판별자가 이제 가능한 경우 최적화되었습니다.Option 타입은 다른 타입에 비해 enum 동일한 양의 공간을 차지 (제공된 정보의 나머지. 그래도 여전히 흥미) 지금은

. 나는 구체적인 내용을 모르지만 그것은 확실하게 어떤 종류의 차별화 된 노동 조합으로 대표된다.

최적화를 위해 내부 표현을 조정할 가능성은 Rust 개발자가 고려하고 있습니다. 여기

패트릭 월튼에 의해 게시 relevant discussion on the dev mailing list입니다 :

여기 컴파일러 최적화를위한 공간을 많이가 이후 나는 열거의 특정 비트 표현 저지 주저 조금입니다. 예를 들어, 우리가 널 (NULL) 포인터로 Option<~int>을 축소 할 수 있습니다, 우리는 널 (NULL) 문자열로 Result<(),~str>을 축소 할 수 있습니다, 또는 우리는 문자열은 최고 256 바이트를 차지할 수 없다는 가정, 한 단어로 Either<u8,~str>을 축소 할 수 있습니다 주소 공간은 입니다. 나는 아마 의 비트 패턴이 Rust enums의 비트 패턴이 지정되지 않았다고 말하면서 을 가능한 한 많이 최적화하여 재생할 수 있다고 생각했습니다.

+1

올바르지 않습니다. (일부) 최적화에 대한 언급이 [구현되었습니다] (https://github.com/mozilla/rust/pull/6001)되었습니다. – huon

+1

글쎄, 당신이 말한 것처럼 이것은 Rust의 현재 릴리즈 버전에 대해 정확하다 :-) – barjak