2010-05-24 2 views
5

Чтобы определить константы, что является более распространенным и правильным способом? Какова стоимость, с точки зрения компиляции, связывания и т. Д., Определения констант с #define? Это еще один способ дешевле?Какова стоимость #define?

+0

Выберите язык, любой язык? –

+1

@Kyle: см. Теги. – Cam

+1

C# не позволяет использовать '# define' для определения констант. Вы можете сделать '#define DEBUG', но не' #define DEBUG 1'. http://msdn.microsoft.com/en-us/library/yt3yck0x.aspx –

ответ

14

Лучший способ определить любой соп писать

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; 
} 

Второй путь, очевидно, лучше.

+2

+1 '# define' также плохой стиль, потому что он не дает никакой явной информации о типе компилятору. – GrahamS

+2

Это точно суммирует стилистические рекомендации, но не отвечает на вопрос. Константы, объявленные в собственном стиле C++, имеют стоимость, которую не имеют #defines. –

+1

@ Dan Olson: Aah, но #defines также имеют стоимость с точки зрения размера кода, так как (в зависимости от умений компилятора) вы можете ввести множество литералов, в которых мог бы работать один const. @Espuz: ни стоимость не стоит беспокоиться (если вы не делаете очень низкоуровневый микропроцессорный материал), так идите с лучшим стилем, который, по возможности, является 'const'. – GrahamS

2

Стоимость только для препроцессора, когда разрешены #defines (игнорирование дополнительной стоимости отладки, связанной с проектом, полным #defines для констант, конечно).

0

#define является заменой строки. Поэтому, если вы ошибаетесь в макросах, они появятся позже, как ошибки. В большинстве случаев неправильные типы или неправильные выражения являются общими.

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

1

#define макросы обрабатываются препроцессором, они не видны компилятору. И поскольку они не видны компилятору в качестве символа, трудно отладить что-то, что связано с макросом.

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

const unsigned int ArraySize = 100; 

Еще лучше

static const unsigned int ArraySize = 100; 

когда константа используется только в одном файле.

1

#define увеличит время компиляции, но он будет быстрее в исполнении ...

обычно в условной компиляции #define используется ...

где соп используется в общем вычисления чисел

Выбор зависит от вашего требования ...

+1

В лучшем случае увеличение скорости с использованием #define будет незначительным. Если компилятор оптимизирует константы, не будет никакого преимущества, и вы потеряете все преимущества const. – JeremyP

+0

yes ... #define удобен в условной компиляции (в кросс-платформенном приложении ...) Это единственное преимущество, которое можно рассмотреть ... –

5

Сам компилятор никогда не видит #define. Препроцессор расширяет все макросы до их передачи в компилятор. Однако один из побочных эффектов состоит в том, что значения повторяются ... и две идентичные строки не обязательно являются одной и той же строкой. Если вы говорите,

#define SOME_STRING "Just an example" 

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

0

Время процессора - это не стоимость использования #define или макросов. «Стоимость» в качестве разработчика выглядит следующим образом:

  • Если в вашем макросе есть ошибка, компилятор отметит это там, где вы ссылались на макрос, а не там, где вы его определили.
  • Вы потеряете безопасность и обзор вашего макроса.
  • Инструменты отладки не будут знать значение макроса.

Эти вещи могут не сжигать циклы процессора, но они могут сжигать циклы проявки.

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

Смежные вопросы