const int не занимает места? - PullRequest
8 голосов
/ 22 августа 2011

В комментарии к этому ответу на использование анонимного перечисления , Оли Чарльзуорт утверждает, что:

const int является неизменным и может не занимать места в зависимости от что компилятор решит сделать.

Если я объявляю const int i = 10, как это 10 сохраняется, если оно "может не занимать места"?

Предполагая, что int составляет 4 байта, я бы предположил, что как минимум 4 байта зарезервированы для хранения 10 как const int.

Ответы [ 7 ]

9 голосов
/ 22 августа 2011

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

Таким образом, переменные могут быть оптимизированы для существования только в регистрах или заменены непосредственными значениями,В псевдо-машинный код:

SET 10, eax
ST eax, &i    # Initialise i

...

LD &i, eax    # Add i to ebx
ADD eax, ebx, ebx

может стать:

SET 10, eax
ADD eax, ebx, ebx

или даже просто:

ADD 10, ebx, ebx
6 голосов
/ 22 августа 2011

Если вы не используете i таким образом, который требует адрес, компилятор обычно будет использовать его только во время компиляции, а во время выполнения все, что останется, это 10, а не переменная.

В частности, поскольку const не изменяется, нет необходимости фактически сохранять его в памяти, если вы не сделаете что-то вроде передачи его функции, которая принимает параметр по ссылке.

4 голосов
/ 22 августа 2011

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

3 голосов
/ 22 августа 2011

Компилятор может подставлять число 10 каждый раз, когда ему нужно прочитать i вместо чтения сохраненного значения.

2 голосов
/ 22 августа 2011

Компилятор может просто заменить все вхождения i в вашем коде на константу 10. Больше нет i, следовательно, нет требований к пространству, он стоит столько же (если компилятор не совсем тупой или видит, что вы бросаете от использования const), так как использование магических чисел просто делает код более читабельным. При небольших константах их можно сложить в инструкции по сборке.

2 голосов
/ 22 августа 2011

Может быть частью кода и использоваться в качестве константы непосредственного значения (например, #define FIVE 5).

0 голосов
/ 22 августа 2011

Скорее всего, он займет место, если вы объявите его в глобальном пространстве имен.Если вы объявите это в теле функции или объявите где-то «статичным», компилятор может удалить его.Если вы объявите это глобально, компилятор не сможет узнать, ссылается ли константа на другой модуль перевода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...