const与D中的枚举

问题描述 投票:6回答:5

从页面底部的here中检查此报价。 (我相信引用的有关const的评论也适用于invariant

枚举与const的不同之处在于它们不占用任何空间在最终输出的对象/库/可执行文件中,而consts在。

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

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

在C ++中,我一直认为这是出于遗留原因,而旧的编译器无法优化常量。但是,如果在D中仍然如此,则必须有更深层次的原因。有人知道为什么吗?

optimization enums const d
5个回答
4
投票

就像在C ++中一样,D中的枚举似乎是“保守的整数文字”(edit:令人惊讶,D2甚至支持floats and strings)。其枚举器没有位置。作为没有身份的价值观,它们只是无关紧要的。

放置enum在D2中是新的。它首先定义一个新变量。它不是左值(因此您也不能使用其地址)。一个

enum int a = 10; // new in D2

就像

enum : int { a = 10 }

如果我可以相信我较差的D知识。因此,此处的a不是左值(没有位置,您不能获取其地址)。但是,const 地址。如果您具有全局(不确定这是否是正确的D术语)常量变量,则编译器通常无法对其进行优化,因为它不知道哪些模块可以访问该变量或可以使用其地址。因此,它必须为其分配存储空间。

我认为,如果您有本地const,编译器仍然可以像在C ++中那样对其进行优化,因为编译器通过查看其范围可以知道是否有人对其地址感兴趣,或者每个人是否都在取其值。


4
投票

您的实际问题;为什么D中的enum / const与C ++中的相同?似乎没有答案。遗憾的是,没有任何理由选择此选项。我相信这只是C ++中的意外副作用,已成为事实上的模式。在D中,需要相同的模式,Walter Bright决定应该像在C ++中那样进行操作,以便来自该位置的人可以识别要做什么...实际上,在做出这个恕我直言的愚蠢决定之前,使用了关键词清单而不是此用例的枚举。


3
投票

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


2
投票

根据我的理解,enum在语法上进行扩展以支持单清单常量的真正目的是,D模板专家Don Clugston正在使用模板做一些疯狂的事情。由于编译器不断为const变量创建内部数据结构,因此他一直耗费较长的构建时间,可笑的编译器内存使用等。与枚举相比,常量/不可变变量的一个关键问题是常量/不可变变量是左值,并且可以使用其地址。这意味着编译器会有一些额外的开销。这通常无关紧要,但是当您执行非常复杂的编译时元程序时,即使const变量已被优化,编译时仍然是相当大的开销。


1
投票

听起来像枚举值将在表达式中被“内联”使用,因为const实际上会占用存储空间,而引用它的任何表达式都将从内存存储中加载该值。

这听起来类似于C#中const与只读之间的区别。前者是编译时常量,而后者是运行时常量。这肯定会影响程序集的版本控制(因为引用只读的程序集将在编译时收到副本,并且如果使用不同的值重建了所引用的程序集,则该值将不会更改)。

© www.soinside.com 2019 - 2024. All rights reserved.