Какова стоимость #define?

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

5
задан emenegro 24 May 2010 в 07:05
поделиться

7 ответов

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

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

Второй способ явно лучше.

14
ответ дан 18 December 2019 в 06:49
поделиться

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

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

const unsigned int ArraySize = 100;

Еще лучше

static const unsigned int ArraySize = 100;

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

1
ответ дан 18 December 2019 в 06:49
поделиться

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

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

0
ответ дан 18 December 2019 в 06:49
поделиться

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

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

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

Выбор зависит по вашему требованию ...

1
ответ дан 18 December 2019 в 06:49
поделиться

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

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

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

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

0
ответ дан 18 December 2019 в 06:49
поделиться

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

2
ответ дан 18 December 2019 в 06:49
поделиться

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

#define SOME_STRING "Just an example"

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

5
ответ дан 18 December 2019 в 06:49
поделиться