gpt4 book ai didi

enums - 枚举与 D 中的不可变

转载 作者:行者123 更新时间:2023-12-03 23:10:40 27 4
gpt4 key购买 nike

有什么区别

enum i = 2;
enum s = "Hello";


immutable i = 2;
immutable s = "Hello";

在 D 2.0 中?

最佳答案

enum是用户定义的类型,而不是变量。 enum e = 2;是一个
类似这样的东西的简写 enum : int { e = 2 } (即匿名
一个成员的枚举 e ),见 the documentation .
根据定义,匿名枚举的所有成员都被放入当前
范围。所以,e是放置在当前作用域中的类型成员,在那里它的行为
literal .
immutable i = 2;另一方面实际上创建了一个变量 i类型为 int。

这种差异有几个后果:

  • enum e将没有内存位置和地址(不是左值),因为
    类型及其成员都没有地址。 IE。你不能做某事
    喜欢 auto ptr = &e; (就像你不能做 auto ptr = &2; )。 immutable
    i
    另一方面是一个普通变量(只是不可变的)。
  • As discussed by Jonathan ,
    不可变变量可以在编译时或运行时初始化,
    而类型(及其所有成员定义类型)必须在
    编译时间。
  • 编译器可以简单地替换e的所有外观与 2 .对于 i
    通常必须创建一个内存位置(尽管优化编译器
    有时可能能够避免这种情况)。为此,期间的工作量
    编译 enum可能会略低一些,并且
    二进制稍微小一些。
  • 数组有一个惊人的差异。对于 enum uint[2] E = [0, 1];immutable uint[2] I = [0, 1];访问 enum ,例如E[0] , 能够
    immutable 慢几个数量级数组,例如I[0] ,
    特别是作为数组 EI变得更大。这是因为对于一个immutable数组,它只是对全局的普通数组查找
    多变的。对于 enum但是看起来每个数组都会被创建
    使用之前的时间,例如在全局函数内部 enum (别
    问我,为什么,但是编译器好像真的只是简单的替换了外观
    在这种情况下也具有值(value))。我从未尝试过,但我会猜到
    这同样适用于 enum字符串和其他非平凡类型。

  • 总结一下:当我使用编译时常量时,我​​通常取 enum除非
    这些常量是数组,或者由于其他原因我需要一个内存位置。

    关于enums - 枚举与 D 中的不可变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4790652/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com