Подтвердить что ты не робот

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

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

enum real E = 2.7182818284590452354L;

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

IIRC в D enum A = B; является более или менее теми же вещами, что и #define A B в C. Он всегда подчиняется в качестве литерала в любом выражении, которое его использует.