Rust에서 참조는 절대 null이 될 수 없으므로 연결 목록과 같이 실제로 null이 필요한 경우에는 다음 Option
유형 을 사용합니다 .
struct Element {
value: i32,
next: Option<Box<Element>>,
}
간단한 포인터와 비교하여 메모리 할당 및 역 참조 단계와 관련하여 얼마나 많은 오버 헤드가 관련됩니까? 컴파일러 / 런타임에 Option
비용이 들지 않게 만드는 “마법” 이 있습니까? 아니면 Option
동일한 enum
구조를 사용하여 비 코어 라이브러리에서 직접 구현 하거나 벡터에 포인터를 래핑하는 것보다 비용이 적게 듭 니까?
답변
예, 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
그 주 &i32
, Box
, &[i32]
, Vec<i32>
모든 사용 내부 비 – 널 포인터 최적화 Option
!