Подтвердить что ты не робот

Сколько памяти занимает постоянная C?

при этом:

const int a = 5;

Интересно, получит ли 4 байта памяти так же, как переменная? (в 32-битной системе)

4b9b3361

Ответ 1

Это зависит от компилятора.

Например:

const int a = 4;

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

Если у вас есть постоянная строка:

static final java.lang.String name = "Foobar";

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

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

Ответ 2

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

Ответ 3

Это зависит.

const int a = 5;

Возьмёт четыре байта памяти (или сколько бы байтов в вашей системе не заняло int).

Если вы сделаете его статическим:

static const int a = 5;

Тогда оптимизатор может свободно заменять каждый экземпляр a на значение 5. Оптимизатор не может сделать это в первом (нестатическом) случае просто потому, что вы можете ссылаться на a в отдельный блок компиляции с:

extern const int a;

Ответ 4

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

Ответ 5

Нет разницы в потреблении памяти между int a и const int a.

Обратите внимание, что в объектах C, объявленных как const, не формируются постоянные выражения (в отличие от С++) и по умолчанию имеют внешнюю привязку (в отличие от С++, снова). Все это означает, что в C постоянный объект в значительной степени похож на непостоянный объект, просто не изменяемый.

Кроме того, это означает, что в C постоянный объект имеет очень мало шансов получить "удаленный", как утверждают другие ответы. Если вы действительно хотите, чтобы это было "съемным" на C, вы должны явно объявить его как static. Но даже это не сделает объект const int для формирования постоянных выражений, т.е. Вы все еще не можете использовать его для обозначения размера массива в C89/90, а в C99 результирующий массив все еще является массивом переменной длины (VLA).

Ответ 6

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

Ответ 7

Как правило, константа будет занимать то же пространство, что и переменная, поэтому, если int 32bit на вашей архитектуре, она также займет 32 бита. Однако компилятор может также принять решение о том, чтобы прямо поместить константу в код, не занимая места для самой константы. Это будет зависеть от того, где константа фактически определена, то есть, если компилятор может определить, что нет возможности либо модифицировать a (например, через const cast), либо принять адрес a.

Ответ 8

для постоянной переменной требуется 4 байта памяти, но если это значение, она требует 0 байт, так как код сборки будет использовать значение, подобное этому

mov eax, 5

здесь 5 не поступает из переменной, но это константа 5, и она даже генерирует более быстрый код, поскольку для извлечения значения не требуется вызов памяти, это всего лишь часть кода сборки

Ответ 9

Во встроенной системе, где постоянное запоминающее устройство отделено от записываемой памяти, эта константа не будет занимать RAM, она будет храниться только в ПЗУ. Аналогично, в системе с виртуальной памятью константы будут загружаться в страницы памяти только для чтения и будут обрабатывать ОЗУ только независимо от того, сколько ходовых копий программы есть.