2009-03-04 91 views
6

查看从here以下页面底部的引用。 (我相信引述评论有关const略施以invariant S以及)常量与枚举中的D

枚举从consts不同,因为它们不消耗在最后输出的对象/库/可执行任何空间 ,而consts做。

因此很明显,value1做会增大可执行文件,而value2被视为文字并没有出现在目标文件英寸

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

早在C++我一直认为这是对传统的原因,老的编译器不能优化掉常量。但是如果D在这一点上仍然如此,那么背后必然有更深的原因。有人知道为什么

回答

4

就像在C++中,d枚举似乎是一个“保守的整数文本”(编辑:惊人,D2甚至支持floats and strings)。其调查员没有地点。作为没有身份的价值观,它们是非物质的。

配售enum在D2中是新的。它首先定义一个新变量。这不是一个左值(所以你也不能接受它的地址)。一个

enum int a = 10; // new in D2 

是像

enum : int { a = 10 } 

如果我能相信我可怜d知识。所以,a在这里不是一个左值(没有位置,你不能接受它的地址)。一个const,但是,有一个地址。如果你有一个全局变量(不知道这是否是正确的D术语)const变量,编译器通常不能优化它,因为它不知道哪些模块可以访问该变量或可以获取它的地址。所以它必须为它分配存储空间。

我想如果你有一个本地的const,编译器仍然可以像C++一样优化它,因为编译器通过查看它的作用域是否知道任何人对它的地址感兴趣,或者每个人是否只需要它的值。

1

这听起来像枚举值将在表达式中“内联”使用,因为const将实际存储并且引用它的任何表达式将从内存存储装载该值。

这听起来很像C#中const和readonly之间的区别。前者是编译时常量,后者是运行时常量。这肯定会影响程序集的版本控制(因为引用readonly的程序集在编译时会收到一个副本,如果引用的程序集使用不同的值重新构建,将不会更改该值)。

3

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

+1

但是,这个愿望假设编译器总是有所有相关的来源。 – larsivi 2009-03-04 16:10:13

+0

如果您想让第三方库访问该const变量,该怎么办?如果它是一个完整的类实例,那么它会变成const? – Marenz 2009-12-19 11:02:53

4

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

2

根据我的理解,enum在语法上被扩展为支持单个清单常量的真正目的是D模板专家Don Clugston正在用模板做一些疯狂的事情。由于编译器一直在为const变量创建内部数据结构,所以他一直在编译时间很长,编译器内存使用率很可笑。与枚举相比,const/immutable变量的一个关键是const/immutable变量是左值,并且可以使用它们的地址。这意味着编译器会有额外的开销。这通常没有关系,但是当你执行真正复杂的编译时元程序时,即使const变量被优化掉,编译时这仍然是很大的开销。