Чтобы определить константы, что является более распространенным и правильным способом? Какова стоимость, с точки зрения компиляции, связывания и т. Д., Определения констант с #define? Это еще один способ дешевле?Какова стоимость #define?
ответ
Лучший способ определить любой соп писать
const int m = 7;
const float pi = 3.1415926f;
const char x = 'F';
Использование #define
плохой C++ стиль. Нельзя скрыть #define
в области пространства имен.
Сравнить
#define pi 3.1415926
с
namespace myscope {
const float pi = 3.1415926f;
}
Второй путь, очевидно, лучше.
+1 '# define' также плохой стиль, потому что он не дает никакой явной информации о типе компилятору. – GrahamS
Это точно суммирует стилистические рекомендации, но не отвечает на вопрос. Константы, объявленные в собственном стиле C++, имеют стоимость, которую не имеют #defines. –
@ Dan Olson: Aah, но #defines также имеют стоимость с точки зрения размера кода, так как (в зависимости от умений компилятора) вы можете ввести множество литералов, в которых мог бы работать один const. @Espuz: ни стоимость не стоит беспокоиться (если вы не делаете очень низкоуровневый микропроцессорный материал), так идите с лучшим стилем, который, по возможности, является 'const'. – GrahamS
Стоимость только для препроцессора, когда разрешены #defines (игнорирование дополнительной стоимости отладки, связанной с проектом, полным #defines для констант, конечно).
#define
является заменой строки. Поэтому, если вы ошибаетесь в макросах, они появятся позже, как ошибки. В большинстве случаев неправильные типы или неправильные выражения являются общими.
Для условной компиляции макросы препроцессора работают лучше всего. Для других констант, которые должны использоваться при вычислении, const
работает хорошо.
#define
макросы обрабатываются препроцессором, они не видны компилятору. И поскольку они не видны компилятору в качестве символа, трудно отладить что-то, что связано с макросом.
Предпочтительным способом определения констант является использование ключевого слова const вместе с соответствующей информацией типа.
const unsigned int ArraySize = 100;
Еще лучше
static const unsigned int ArraySize = 100;
когда константа используется только в одном файле.
#define увеличит время компиляции, но он будет быстрее в исполнении ...
обычно в условной компиляции #define используется ...
где соп используется в общем вычисления чисел
Выбор зависит от вашего требования ...
В лучшем случае увеличение скорости с использованием #define будет незначительным. Если компилятор оптимизирует константы, не будет никакого преимущества, и вы потеряете все преимущества const. – JeremyP
yes ... #define удобен в условной компиляции (в кросс-платформенном приложении ...) Это единственное преимущество, которое можно рассмотреть ... –
Сам компилятор никогда не видит #define. Препроцессор расширяет все макросы до их передачи в компилятор. Однако один из побочных эффектов состоит в том, что значения повторяются ... и две идентичные строки не обязательно являются одной и той же строкой. Если вы говорите,
#define SOME_STRING "Just an example"
это совершенно законно для компилятора, чтобы добавить копию строки в выходной файл каждый раз, когда он видит строку. Хороший компилятор, вероятно, устранит дубликаты литералов, но это дополнительная работа, которую он должен сделать. Если вы используете const, компилятор не должен беспокоиться об этом.
Время процессора - это не стоимость использования #define или макросов. «Стоимость» в качестве разработчика выглядит следующим образом:
- Если в вашем макросе есть ошибка, компилятор отметит это там, где вы ссылались на макрос, а не там, где вы его определили.
- Вы потеряете безопасность и обзор вашего макроса.
- Инструменты отладки не будут знать значение макроса.
Эти вещи могут не сжигать циклы процессора, но они могут сжигать циклы проявки.
Для констант, считая переменные const
предпочтительнее, и для небольших функций, не зависящих от типа, предпочтительны встроенные функции и шаблоны.
- 1. Какова область действия #define?
- 2. Какова стоимость вызова array.length
- 3. Какова стоимость создания объекта
- 4. Какова фактическая стоимость «line.separator»?
- 5. Какова стоимость выполнения Swift?
- 6. Какова стоимость распаковки коллекций?
- 7. Какова стоимость трафика Heroku?
- 8. Какова стоимость '$ (this)'?
- 9. Какова стоимость неиспользуемого sproc
- 10. Какова стоимость заявления
- 11. Какова добавленная стоимость BDD?
- 12. Какова «стоимость» отображения .NET?
- 13. Какова стоимость включения профилирования памяти?
- 14. Какова возвращаемая стоимость тройной операции «?:»?
- 15. Какова стоимость доступа к памяти?
- 16. APNS - какова стоимость отправки сообщения?
- 17. Какова должна быть стоимость androidboot.mode?
- 18. Какова стоимость попыток захвата блоков?
- 19. Какова стоимость ContainsAll в Java?
- 20. Какова реальная стоимость транзакции SQL?
- 21. Какова начальная стоимость установки CruiseControl?
- 22. Какова стоимость исполнения вызова Thread.isInterrupted()?
- 23. Какова стоимость WeakRef в Ruby?
- 24. Какова цель этого #define в перечислении?
- 25. Список с повторяющимися объектами - Какова стоимость памяти?
- 26. Какова стоимость использования шаблона данных частного класса?
- 27. Какова стоимость безымянного объема в C?
- 28. Какова стоимость выполнения сравнений строк для INotifyPropertyChanged?
- 29. Какова стоимость/сложность вызова функции String.indexOf()
- 30. Какова стоимость времени выполнения следующего алгоритма?
Выберите язык, любой язык? –
@Kyle: см. Теги. – Cam
C# не позволяет использовать '# define' для определения констант. Вы можете сделать '#define DEBUG', но не' #define DEBUG 1'. http://msdn.microsoft.com/en-us/library/yt3yck0x.aspx –