zil*_*n01 6 optimization enums d const
从这里查看此引用,在页面底部.(我相信引用的关于consts的评论也适用于invariants)
枚举与consts的不同之处在于它们不消耗最终输出对象/库/可执行文件中的任何空间,而consts则不会.
因此显然value1会使可执行文件膨胀,而value2被视为文字并且不会出现在目标文件中.
const int value1 = 0xBAD;
enum int value2 = 42;
Run Code Online (Sandbox Code Playgroud)
回到C++我总是认为这是出于遗留原因,以及无法优化常数的旧编译器.但如果在D中仍然如此,那么必然会有更深层次的原因.谁知道为什么?
就像在 C++ 中一样,D 中的枚举似乎是“保守的整数文字”(编辑:令人惊奇的是,D2 甚至支持浮点数和字符串)。它的枚举器没有位置。它们就像没有身份的价值观一样,是非物质的。
放置enum是 D2 中的新内容。它首先定义一个新变量。它不是左值(因此您也无法获取它的地址)。一个
enum int a = 10; // new in D2
Run Code Online (Sandbox Code Playgroud)
就好像
enum : int { a = 10 }
Run Code Online (Sandbox Code Playgroud)
如果我可以相信我可怜的 D 知识。所以,a这里不是左值(没有位置,你不能获取它的地址)。然而,常量有一个地址。如果您有一个全局(不确定这是否是正确的 D 术语)const 变量,编译器通常无法优化它,因为它不知道哪些模块可以访问该变量或可以获取其地址。所以它必须为其分配存储空间。
我认为如果你有一个本地常量,编译器仍然可以像在 C++ 中一样优化它,因为编译器通过查看它的范围知道是否有人对它的地址感兴趣,或者是否每个人都只获取它的值。