Почему Фобос использует enum для констант?

Почему Фобос использует enum для определения констант? Например, в std.math:

enum real E = 2.7182818284590452354L;

Почему бы не использовать глобальный неизменный ? Каковы преимущества / недостатки enum перед неизменяемым ?

16
задан Peter Alexander 1 September 2010 в 22:54
поделиться

1 ответ

  1. Перечисление — это только rvalue, а не lvalue. У него нет адреса.
  2. Перечисление может быть только константой времени компиляции, но не константой времени выполнения.
  3. Перечисления не увеличивают размер объектного файла.
  4. Перечисления компилируются быстрее и используют меньше памяти во время компиляции. Обычно это незначительно, но если вы занимаетесь достаточно сложным метапрограммированием, это может начать иметь значение.

В общем, для вещей, которые являются константами времени компиляции, а не константами времени выполнения, нет никаких недостатков в использовании перечисления, и у него есть преимущества, заключающиеся в том, что ваши намерения абсолютно ясны и немного более эффективны.

Редактировать: еще один вариант использования перечислений может помочь компилятору устранить неоднозначность в отношении того, должна ли функция оцениваться во время выполнения или во время компиляции. Если результат функции назначен неизменяемой переменной стека, функция будет оцениваться во время выполнения. Если вы используете enum в той же области, результат будет оцениваться во время компиляции.

22
ответ дан 30 November 2019 в 21:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: