Meh*_*dad 13 enums d immutability
有什么区别
enum i = 2;
enum s = "Hello";
Run Code Online (Sandbox Code Playgroud)
和
immutable i = 2;
immutable s = "Hello";
Run Code Online (Sandbox Code Playgroud)
在D 2.0?
ste*_*han 23
An enum是用户定义的类型,而不是变量. enum e = 2;这是一个类似的东西的简写enum : int { e = 2 }(即一个成员的匿名枚举e),请参阅文档.根据定义,匿名枚举的所有成员都被放入当前范围.因此,e是一个放置在当前作用域中的类型成员,其行为类似于文字.
immutable i = 2;另一方面,实际上创建了一个iint类型的变量.
这种差异有几个后果:
enum e将没有内存位置和没有地址(没有左值),因为类型及其成员都没有地址.也就是说你做不了什么auto ptr = &e;(就像你不能做的那样auto ptr = &2;).immutable
i另一方面是一个正常变量(只是不可变).ewith的所有外观2.因为i它通常必须创建一个内存位置(尽管优化编译器有时可能会避免这种情况).出于这个原因,编译期间的工作负载enum可能会有所降低,而二进制文件会更小一些.enum uint[2] E = [0, 1];与
immutable uint[2] I = [0, 1];所述访问enum,例如E[0],可以比对于慢几个数量级immutable阵列,例如I[0],特别是当阵列E和I得到更大.这是因为对于一个
immutable数组,它只是一个普通的数组查找,比如一个全局变量.对于enum然而,它看起来像阵列被创建每次被使用之前,例如在函数内部的一个全球性的enum(不要问我,为什么,但是编译器似乎真的只是替换值出现在这种情况下,太).我从来没有尝试,但会猜测这同样适用于enum字符串和其他非平凡的类型.总结一下:当我使用编译时常量时,我通常会采用enum除非那些常量是数组或由于其他原因我需要内存位置.
枚举总是在编译时初始化.因此,必须为它们分配可通过CTFE(编译时功能评估)创建的值.
不可变变量可以在运行时初始化.如果不可变变量具有全局生命周期(因此它是模块变量或静态类或静态局部变量),那么它必须在编译时或在运行时使用静态构造函数初始化(尽管静态局部变量不能被赋予静态构造函数).如果不可变变量是非静态局部变量,那么它在运行时初始化(但如果值是常量,则编译器可能会优化它并在编译时初始化它).因此,您可以在运行时创建不可变的局部变量,这与枚举不同.
编辑:我忘记了另一个案例:不可变成员变量必须直接用CTFE初始化或用不可变构造函数初始化.如果使用CTFE直接初始化不可变成员varible,那么显然在编译时完成,而在不可变构造函数中初始化它是在运行时完成的.
| 归档时间: |
|
| 查看次数: |
1205 次 |
| 最近记录: |