константа по сравнению с перечислением в D

Эта проблема была из-за несовместимой версии библиотеки pod для Xcode 10.2. Решено путем обновления всей библиотеки до версии, совместимой с Xcode 10.2.

6
задан zildjohn01 4 March 2009 в 04:03
поделиться

5 ответов

Точно так же, как в C++, перечисление в D, кажется, "сохраненный целочисленный литерал" (редактирование: удивительный, D2 даже поддерживает плавания и строки). Его перечислители не имеют никакого расположения. Они являются просто несущественными как значения без идентификационных данных.

Размещение enum является новым в D2. Это сначала определяет новую переменную. Это не lvalue (таким образом, Вы также не можете взять его адрес).

enum int a = 10; // new in D2

Похож

enum : int { a = 10 }

Если я могу доверять своему плохому знанию D. Так, a в вот не lvalue (никакое местоположение, и Вы не можете взять его адрес). Константа, однако, имеет адрес. Если у Вас есть глобальное (не уверенный, является ли это правом D терминология), переменная константы, компилятор обычно не может оптимизировать его далеко, потому что это не знает, какие модули могут получить доступ к той переменной или могли взять ее адрес. Таким образом, это должно выделить устройство хранения данных для него.

Я думаю, есть ли у Вас локальная константа, компилятор может все еще оптимизировать ее далеко так же, как в C++, потому что компилятор знает путем рассмотрения его объема, интересуется ли любой его адресом или принимают ли все просто его значение.

4
ответ дан 8 December 2019 в 17:27
поделиться

Ваш фактический вопрос; почему перечисление/константа является тем же в D как в C++; кажется, является оставшимся без ответа. Печально там не существует никакое серьезное основание для этого выбора вообще. Я полагаю, что это было просто неумышленным побочным эффектом в C++, который стал фактическим шаблоном. В D был необходим тот же шаблон, и Walter Bright решил, что он должен быть сделан как в C++, таким образом, что те, которые прибывают из того места, распознали бы, что сделать... На самом деле, перед этим скорее, по моему скромному мнению, глупое решение, декларация ключевого слова использовалась вместо перечисления для этого варианта использования.

4
ответ дан 8 December 2019 в 17:27
поделиться

Это кажется, что перечисление значений будет использоваться "встроенное" в выражениях, где, поскольку константа на самом деле возьмет устройство хранения данных, и любое выражение, ссылающееся на него, будет загружать значение из устройства хранения данных памяти.

Этот звук, подобный различию между константой по сравнению с только для чтения в C#. Первый - постоянное время компиляции, и позже константа этапа выполнения. Это определенно затронутое управление версиями блоков (так как блоки, ссылающиеся на только для чтения, получили бы копию во время компиляции и не получили бы изменение в значении, если бы блок, на который ссылаются, был восстановлен с другим значением).

1
ответ дан 8 December 2019 в 17:27
поделиться

Я думаю, что хороший компилятор/компоновщик должен все еще удалить константу. Это просто, что с перечислением, это на самом деле гарантируется в спецификации. Различием является, прежде всего, вопрос семантики. (Также имейте в виду, что 2.0 еще не завершено),

3
ответ дан 8 December 2019 в 17:27
поделиться

Реальная цель enum быть расширенным синтаксически для поддержки единственных явных констант, от того, что я понимаю, состоит в том, что Don Clugston, гуру шаблона D, делал некоторый сумасшедший материал с шаблонами. Он продолжал сталкиваться с долгим временем изготовления, смешным использованием памяти компилятора, и т.д. потому что компилятор продолжал создавать внутренние данные strucutres для переменных константы. Одна ключевая вещь о переменных константы / неизменных переменных по сравнению с перечислениями состоит в том, что переменные константы / неизменные переменные являются lvalues и могли взять их адрес. Это означает, что существуют некоторые дополнительные издержки для компилятора. Это обычно не имеет значения, но когда Вы выполняете действительно сложные метапрограммы времени компиляции, даже если переменные константы оптимизированы далеко, это - все еще значительные издержки во время компиляции.

2
ответ дан 8 December 2019 в 17:27
поделиться
Другие вопросы по тегам:

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