7

从此处查看此报价,位于页面底部。(我相信引用的关于consts 的评论也适用于invariants)

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

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

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

回到 C++ 中,我一直认为这是由于遗留原因,以及无法优化常量的旧编译器。但如果这在 D 中仍然成立,那么这背后一定有更深层次的原因。有谁知道为什么?

4

5 回答 5

4

就像在 C++ 中一样,D 中的枚举似乎是一个“保守的整数文字”(编辑:令人惊叹,D2 甚至支持浮点数和字符串)。它的枚举器没有位置。作为没有身份的价值观,它们只是无关紧要的。

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

enum int a = 10; // new in D2

就好像

enum : int { a = 10 }

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

我认为如果你有一个本地常量,编译器仍然可以像在 C++ 中一样优化它,因为编译器通过查看它的范围来知道是否有人对其地址感兴趣,或者是否每个人都只接受它的价值。

于 2009-03-04T04:40:31.357 回答
4

您的实际问题;为什么 D 中的 enum/const 与 C++ 中的相同;似乎没有答案。遗憾的是,这种选择没有充分的理由。我相信这只是 C++ 中一个无意的副作用,它成为了事实上的模式。在 D 中需要相同的模式,Walter Bright 决定应该像在 C++ 中那样完成,这样来自那个地方的人就会知道要做什么......事实上,在这个相当愚蠢的决定之前,使用了关键字 manifest而不是这个用例的枚举。

于 2009-03-04T16:04:26.487 回答
3

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

于 2009-03-04T04:31:33.907 回答
2

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

于 2009-03-04T16:19:59.943 回答
1

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

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

于 2009-03-04T04:25:41.533 回答