는, 참조는 null이 될 수 없다 간단한 포인터와 비교할 때 할당 및 참조 해제 단계가 필요합니까? Option
을 enum
구조체를 사용하여 비 핵심 라이브러리에서 Option
을 직접 구현하거나, 벡터에 포인터를 래핑하는 것보다 Option
을 비용 부담이 적게 드는 "마법"이 있습니까? ?Rust 's Option 유형의 오버 헤드는 무엇입니까?</p> <pre><code>struct Element { value: i32, next: Option<Box<Element>>, } </code></pre> <p>얼마나 많은 오버 헤드 메모리의 측면에서이에 참여하고있다 : 당신이 실제로 링크리스트와 같은, null을해야 할 경우, 당신은 <code>Option</code> 유형을 사용할 수 있도록 녹에서
51
A
답변
55
예, 대부분의 경우 Option<ptr>
을 단일 포인터로 최적화하는 일부 컴파일러 마법이 있습니다. &i32
가 Box
가 &[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
내부의 최적화!
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의 비트 패턴이 지정되지 않았다고 말하면서 을 가능한 한 많이 최적화하여 재생할 수 있다고 생각했습니다.
또한,이 최적화는 모든 "옵션"과 같은 "enums"에서 발생하므로 사용자 정의 된'Option'에도 적용됩니다. –