Сколько памяти занимает постоянная C?
при этом:
const int a = 5;
Интересно, получит ли 4 байта памяти так же, как переменная? (в 32-битной системе)
Ответы
Ответ 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, она будет храниться только в ПЗУ. Аналогично, в системе с виртуальной памятью константы будут загружаться в страницы памяти только для чтения и будут обрабатывать ОЗУ только независимо от того, сколько ходовых копий программы есть.