为什么 Phobos 使用枚举作为常量?

发布于 2024-09-17 07:16:12 字数 211 浏览 8 评论 0原文

为什么Phobos使用enum来定义常量?例如,在 std.math 中:

enum real E = 2.7182818284590452354L;

为什么不使用全局不可变?与 immutable 相比,enum 的优点/缺点是什么?

Why does Phobos use enum to define constants? For example, in std.math:

enum real E = 2.7182818284590452354L;

Why not use a global immutable? What are the advantages/disadvantages of enum over immutable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝天 2024-09-24 07:16:12
  1. 枚举只是右值,而不是左值。它没有地址。
  2. 枚举只能是编译时常量,而不能是运行时常量。
  3. 枚举不会向目标文件添加任何膨胀。
  4. 枚举编译速度更快,并且在编译时使用更少的内存。通常它可以忽略不计,但如果您正在进行足够复杂的元编程,它就会开始变得重要。

一般来说,对于编译时常量而不是运行时常量,使用枚举没有任何缺点,而且它的优点是使您的意图绝对清晰并且效率更高。

编辑:枚举的另一种用例可以向编译器明确函数是否应该在运行时或编译时求值。如果函数的结果被分配给不可变堆栈变量,则该函数将在运行时计算。如果您在同一范围内使用enum,则将在编译时评估结果。

  1. An enum is only an rvalue, not an lvalue. It has no address.
  2. An enum can only be a compile time constant, not a runtime constant.
  3. Enums don't add any bloat to the object file.
  4. Enums compile faster and use less memory at compile time. Usually it's negligible, but if you're doing sufficiently complicated metaprogramming it can start to matter.

In general, for things that are compile-time constants as opposed to runtime constants, there's no disadvantage to using an enum, and it has the advantages of making your intentions absolutely clear and being marginally more efficient.

Edit: One other use case for enums can be disambiguating to the compiler whether a function should be evaluated at runtime or compile time. If the result of a function is assigned to an immutable stack variable, the function will be evaluated at runtime. If you use an enum in the same scope, the result will be evaluated at compile time.

情独悲 2024-09-24 07:16:12

D enum A = B; 中的 IIRC 与 C 中的 #define A B 或多或少相同。在任何使用它。

IIRC in D enum A = B; is more or less the same things as #define A B is in C. It is always subbed in as a literal in any expression that uses it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文