有什么区别
enum i = 2;
enum s = "Hello";
and
immutable i = 2;
immutable s = "Hello";
在 D 2.0 中?
An enum
是用户定义的类型,而不是变量。 enum e = 2;
是一个
像这样的东西的简写enum : int { e = 2 }
(即匿名
具有一名成员的枚举e
), see 文档 http://www.digitalmars.com/d/2.0/enum.html。
根据定义,匿名枚举的所有成员都被放入当前
范围。所以,e
是放置到当前作用域中的类型成员,其行为在当前作用域中
像一个literal http://en.wikipedia.org/wiki/Literal_%28computer_science%29.
immutable i = 2;
另一方面实际上创建了一个变量i
int 类型。
这种差异会带来几个后果:
-
enum e
将没有内存位置和地址(没有左值),因为
类型及其成员都没有地址。 IE。你不能做某事
喜欢auto ptr = &e;
(就像你不能做的那样auto ptr = &2;
). immutable
i
另一方面是普通变量(只是不可变)。
-
正如乔纳森所讨论的 https://stackoverflow.com/questions/4790652/enum-vs-immutable-in-d/4790779#4790779,
不可变变量可以在编译时或运行时初始化,
而类型(及其定义该类型的所有成员)必须已知
编译时间。
- 编译器可以简单地替换所有出现的
e
with 2
. For i
它
通常必须创建一个内存位置(尽管优化编译器
有时也许可以避免这种情况)。为此,期间的工作量
编译为enum
预计会稍微低一些,并且
二进制稍微小一些。
- 数组有一个令人惊讶的差异。为了
enum uint[2] E = [0, 1];
and
immutable uint[2] I = [0, 1];
的访问权enum
, e.g. E[0]
, 能
比immutable
数组,例如I[0]
,
特别是作为数组E
and I
变得更大。之所以如此,是因为对于immutable
数组,它只是一个普通的数组查找,比如说,一个全局的
多变的。为了enum
但是看起来数组是每隔
使用前的时间,例如在全局函数内部enum
(不
问我为什么,不过编译器好像真的只是简单的替换了外观
也具有本例中的值)。我从未尝试过,但我猜想
这同样适用于enum
字符串和其他重要类型。
总结一下:当我使用编译时常量时,我通常采用enum
除非
这些常量是数组,或者由于其他原因我需要一个内存位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)