代码之家  ›  专栏  ›  技术社区  ›  zildjohn01

D中的常量与枚举

  •  6
  • zildjohn01  · 技术社区  · 16 年前

    查看此报价 here ,在页面底部。(我相信引用的评论 const 适用于 invariant S也一样)

    枚举不同于常量,因为它们不占用任何空间 在最终输出的对象/库/可执行文件中,而consts是这样做的。

    如此明显 value1 将膨胀可执行文件,而 value2 被视为文本,不显示在对象文件中。

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

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

    5 回复  |  直到 16 年前
        1
  •  4
  •   Johannes Schaub - litb    16 年前

    就像C++一样,d中的枚举似乎是一个“保守的整数文字”。 编辑 :太棒了,d2甚至支持 floats and strings )它的枚举器没有位置。它们只是不重要的价值观,没有同一性。

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

    enum int a = 10; // new in D2
    

    就像

    enum : int { a = 10 }
    

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

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

        2
  •  4
  •   larsivi    16 年前

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

        3
  •  3
  •   FeepingCreature    16 年前

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

        4
  •  2
  •   dsimcha    16 年前

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

        5
  •  1
  •   chrish    16 年前

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

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

    推荐文章