Почему Фобос использует enum для констант? - PullRequest
16 голосов
/ 02 сентября 2010

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

enum real E = 2.7182818284590452354L;

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

Ответы [ 2 ]

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

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

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

4 голосов
/ 02 сентября 2010

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

...