常量与枚举中的D
回答
就像在C++中,d枚举似乎是一个“保守的整数文本”(编辑:惊人,D2甚至支持floats and strings)。其调查员没有地点。作为没有身份的价值观,它们是非物质的。
配售enum
在D2中是新的。它首先定义一个新变量。这不是一个左值(所以你也不能接受它的地址)。一个
enum int a = 10; // new in D2
是像
enum : int { a = 10 }
如果我能相信我可怜d知识。所以,a
在这里不是一个左值(没有位置,你不能接受它的地址)。一个const,但是,有一个地址。如果你有一个全局变量(不知道这是否是正确的D术语)const变量,编译器通常不能优化它,因为它不知道哪些模块可以访问该变量或可以获取它的地址。所以它必须为它分配存储空间。
我想如果你有一个本地的const,编译器仍然可以像C++一样优化它,因为编译器通过查看它的作用域是否知道任何人对它的地址感兴趣,或者每个人是否只需要它的值。
这听起来像枚举值将在表达式中“内联”使用,因为const将实际存储并且引用它的任何表达式将从内存存储装载该值。
这听起来很像C#中const和readonly之间的区别。前者是编译时常量,后者是运行时常量。这肯定会影响程序集的版本控制(因为引用readonly的程序集在编译时会收到一个副本,如果引用的程序集使用不同的值重新构建,将不会更改该值)。
我认为一个好的编译器/链接器应该仍然删除常量。这只是与枚举,它实际上保证了规范。差异主要是语义问题。 (记住,2.0尚未完成同样保持)
您的实际问题;为什么enum/const在D中和C++一样;似乎没有答案。可悲的是,这种选择没有任何理由。我相信这只是C++中的无意的副作用,已经成为事实上的模式。在D中,需要相同的模式,Walter Bright决定应该像使用C++一样完成,以便那些来自那个地方的人会认识到该做什么......事实上,在这个相当愚蠢的决定之前,使用了关键字清单而不是此用例的枚举。
根据我的理解,enum
在语法上被扩展为支持单个清单常量的真正目的是D模板专家Don Clugston正在用模板做一些疯狂的事情。由于编译器一直在为const变量创建内部数据结构,所以他一直在编译时间很长,编译器内存使用率很可笑。与枚举相比,const/immutable变量的一个关键是const/immutable变量是左值,并且可以使用它们的地址。这意味着编译器会有额外的开销。这通常没有关系,但是当你执行真正复杂的编译时元程序时,即使const变量被优化掉,编译时这仍然是很大的开销。
- 1. 全局常量与枚举
- 2. 枚举常量
- 3. 枚举和常量
- 4. 枚举VS在d
- 5. Java枚举与字符串常量
- 6. Java枚举与静态常量
- 7. 接通枚举在Java中:不合格的枚举常量
- 8. MSVC常量枚举类型
- 9. 常量枚举(tsc.js VS typescript.js)
- 10. Grails:java.lang.IllegalArgumentException:没有枚举常量
- 11. 没有枚举常量org.primefaces.extensions.component.exporter.DefaultExporterFactory.ExporterType.CSV
- 12. 枚举中的数字常量(c#)
- 13. 为什么使用字符串常量与枚举常量?
- 14. 动态加载Java枚举类和枚举常量
- 15. Xtext交叉引用枚举的常量
- 16. 带数字常量的枚举类型
- 17. 的Java枚举超过常量
- 18. 的Java:访问常量枚举(ENUM)
- 19. 带常量的单例枚举
- 20. 选择枚举类常量的问题
- 21. 警告:未知的枚举常量Status.STABLE
- 22. 与protobuf的枚举替换C++枚举
- 23. 警告:左说不枚举常量javafx.geometry.Pos.LEFT
- 24. 了解枚举 - 用作常量
- 25. 枚举和常量。哪个使用时?
- 26. Java - 重命名枚举常量
- 27. 存储枚举常量数据库
- 28. JavaPoet添加枚举常量列表
- 29. 按名称检索Scala枚举常量
- 30. 为什么Phobos使用枚举常量?
但是,这个愿望假设编译器总是有所有相关的来源。 – larsivi 2009-03-04 16:10:13
如果您想让第三方库访问该const变量,该怎么办?如果它是一个完整的类实例,那么它会变成const? – Marenz 2009-12-19 11:02:53