如果我定义以下枚举,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
}
Yields:
// -> 4
// -> 8
当我定义枚举时会发生什么?如何为这些结构分配内存?
枚举的一种简单方法是为其最大变体的内容以及判别式分配足够的空间。这是一个标准标记联盟.
Rust 比这聪明一点。 (它可能会更聪明,但目前还不是。)它知道给定一个~T
,该内存位置至少有一个值cannot是:零。所以在像你这样的情况下enum { Cons(~T), Nil }
,它能够将其优化为一个字,并且内存中的任何非零值都有意义Cons(~T)
以及内存意义中的零值Nil
.
当你处理char
,优化无法发生:零是有效的代码点。当它发生的时候,char
被定义为 Unicode 代码点,所以它would实际上可以将变体优化到该空间中,最后有大量的备用位(Unicode 字符只需要 21 位,因此在 32 位空间中我们有 11 个备用位)。这证明了 Rust 的枚举判别式优化目前还不是特别聪明。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)