此处查看此引用,朝向页面底部。 (我相信引用的关于 const 的评论也适用于 invariant s)

  

枚举与consts不同,因为它们不占用任何空间   在最终输出的对象/库/可执行文件中,而consts确实如此。

显然 value1 会使可执行文件膨胀,而 value2 被视为文字并且不会出现在目标文件中。

const int value1 = 0xBAD;
enum int value2 = 42;

回到C ++我总是认为这是出于遗留原因,以及那些无法优化常数的旧编译器。但如果在D中仍然如此,那么必然会有更深层次的原因。谁知道为什么?

其他提示

你的实际问题;为什么enum / const在D中与在C ++中相同;似乎没有答案。可悲的是,这种选择没有充分的理由。我认为这只是C ++中无意的副作用,成为事实上的模式。在D中需要相同的模式,并且Walter Bright决定它应该像在C ++中那样完成,以便那些来自那个地方的人会认识到该做什么......事实上,在这个相当恕我直言的愚蠢决定之前,使用了关键字manifest而不是这个用例的枚举。

我认为一个好的编译器/链接器仍然应该删除常量。这只是枚举,实际上在规范中得到了保证。差异主要是语义问题。 (还要记住,2.0尚未完成)

根据我的理解, enum 在语法上被扩展以支持单个清单常量的真正目的是D模板大师Don Clugston用模板做了一些疯狂的事情。他一直在运行很长的构建时间,荒谬的编译器内存使用等等,因为编译器不断为const变量创建内部数据结构。与枚举相比,const / immutable变量的一个关键点是const / immutable变量是lvalues并且可以获取它们的地址。这意味着编译器有一些额外的开销。这通常无关紧要,但是当你执行非常复杂的编译时元程序时,即使const变量被优化掉,这在编译时仍然是一个很大的开销。

听起来,enum值将被用于“内联”。在表达式中,const实际上会占用存储空间,任何引用它的表达式都将从内存存储器中加载值。

这种声音类似于C#中const与readonly的区别。前者是编译时常量,后者是运行时常量。这肯定会影响程序集的版本控制(因为引用只读的程序集会在编译时收到副本,如果使用不同的值重建引用的程序集,则不会对该值进行更改。)

scroll top