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

при выполнении этого:

const int a = 5;

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

9 ответов


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

например:

const int a = 4;

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

Если у вас была постоянная строка:

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

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

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


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


Это зависит.

const int a = 5;

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

если вы сделаете это статическое:

static const int a = 5;

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

extern const int a;

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


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

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

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


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


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


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

mov eax, 5

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


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