[英]Why does Nil increase one enum size but not another? How is memory allocated for Rust enums?
如果我定義以下枚舉,Nil不會增加枚舉的大小:
use std::mem::size_of;
enum Foo {
Cons(~char)
}
enum Bar {
Cons(~char),
Nil
}
println!("{}", size_of::<Foo>());
println!("{}", size_of::<Bar>());
// -> 4
// -> 4
另一方面:
enum Foo {
Cons(char)
}
enum Foo {
Cons(char),
Nil
}
產量:
// -> 4
// -> 8
定義枚舉時發生了什么? 如何為這些結構分配內存?
對枚舉的一種天真的方法是為其最大變體的內容分配足夠的空間,以及判別。 這是標准的標記聯合 。
Rust比這更聰明一點。 (它可能更加聰明,但目前還不是。)它知道給定一個~T
,至少有一個值,該內存位置不能為:零。 因此,在你的enum { Cons(~T), Nil }
,它能夠將其優化為一個單詞,內存中的任何非零值意味着Cons(~T)
和內存中的零值意義Nil
。
處理char
,不能進行優化:零是有效的代碼點。 碰巧的是, char
被定義為一個Unicode碼點,因此它實際上將是可能的變體優化成空間,有被大量在末端備用比特(Unicode字符只需要21個比特,所以,在32位空間我們有11個備用位)。 這表明Rust的枚舉判別優化目前並不是特別聰明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.