从页面底部的here查看此引文。 (我相信有关const
的引用评论也适用于invariant
)
枚举与consts不同,因为它们不占用任何空间 在最终输出的对象/库/可执行文件中,而consts确实如此。
显然value1
会使可执行文件膨胀,而value2
被视为文字并且不会出现在目标文件中。
const int value1 = 0xBAD;
enum int value2 = 42;
回到C ++我总是认为这是出于遗留原因,以及那些无法优化常数的旧编译器。但如果在D中仍然如此,那么必然会有更深层次的原因。谁知道为什么?
答案 0 :(得分:4)
就像在C ++中一样,D中的枚举似乎是“保守的整数文字”(编辑:惊人,D2甚至支持floats and strings)。它的普查员没有位置。它们只是没有身份的价值观无关紧要。
在D2中放置enum
是新的。它首先定义一个新变量。它不是左值(所以你也不能拿它的地址)。一个
enum int a = 10; // new in D2
就像
enum : int { a = 10 }
如果我能相信我可怜的D知识。所以,a
在这里不是左值(没有位置,你不能取其地址)。但是,const 具有地址。如果你有一个全局(不确定这是否是正确的D术语)const变量,编译器通常无法对其进行优化,因为它不知道哪些模块可以访问该变量或者可以获取其地址。所以它必须为它分配存储空间。
我认为如果你有一个本地const,编译器仍然可以像在C ++中那样对其进行优化,因为编译器通过查看其范围来了解是否有人对其地址感兴趣或者每个人是否都接受了它的值。
答案 1 :(得分:4)
你的实际问题;为什么enum / const在D中与在C ++中相同;似乎没有答案。可悲的是,这种选择没有充分的理由。我认为这只是C ++中无意的副作用,成为事实上的模式。在D中需要相同的模式,并且Walter Bright决定它应该像在C ++中那样完成,以便那些来自那个地方的人会认识到该做什么......事实上,在这个相当恕我直言的愚蠢决定之前,使用了关键字manifest而不是这个用例的枚举。
答案 2 :(得分:3)
我认为一个好的编译器/链接器仍然应该删除常量。这只是枚举,实际上在规范中得到了保证。差异主要是语义问题。 (还要记住,2.0尚未完成)
答案 3 :(得分:2)
根据我的理解,enum
语法扩展以支持单个清单常量的真正目的是,D模板大师Don Clugston正在使用模板做一些疯狂的事情。他一直在运行很长的构建时间,荒谬的编译器内存使用等,因为编译器不断为const变量创建内部数据结构。与枚举相比,const / immutable变量的一个关键点是const / immutable变量是lvalues并且可以获取它们的地址。这意味着编译器有一些额外的开销。这通常无关紧要,但是当你执行非常复杂的编译时元程序时,即使const变量被优化掉,这在编译时仍然是一个很大的开销。
答案 4 :(得分:1)
听起来enum值将在表达式中使用“inline”,因为const实际上会占用存储空间,任何引用它的表达式都将从内存存储器中加载值。
这种声音类似于C#中const与readonly的区别。前者是编译时常量,后者是运行时常量。这肯定会影响程序集的版本控制(因为引用只读的程序集会在编译时收到副本,如果使用不同的值重建引用的程序集,则不会对该值进行更改。)