2009-11-03 2 views
12

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

const int a = 5; 

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

+0

, если он является глобальным и никогда не будет изменен, дать оптимизатору руку помощи и сделать ее 'static const int a = 5;' –

+0

"' const' "- это ключевое слово с неправильными коннотациями. Он не создает «const» в ежедневном значении: он создает простой старый обычный объект, который нельзя записать. Я был бы счастливее, если бы ключевое слово для концепции было «readonly», когда оно было введено на язык _no, я не думаю, что было бы хорошо изменить его ** сейчас ** _ – pmg

+0

Нечетный. Я не использовал C/C++ в течение длительного времени (.Net сейчас), но я думал, что 'const int' является добавлением C++, и вам нужно' # define' в C. –

ответ

-1

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

Например:

const int a = 4; 

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

Если вы имели постоянную строку:

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

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

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

+0

Я также думаю, что это зависит от компилятора – root

1

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

13

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

+12

Постоянные объекты в C по умолчанию имеют внешнюю связь. Вот почему оптимизатору довольно сложно удалить их: они должны быть экспортированы из объектного файла. Только более продвинутые глобальные оптимизаторы могут это сделать, поэтому не удивляйтесь, если он не будет удален. В C, если вы хотите «сменную» константу, вы должны явно объявить ее «static». – AnT

+0

Это означает, что компилятор, скорее всего, * будет * заменять все ссылки на константу буквенным символом '5', но все же у него нет непосредственной свободы удалить исходный постоянный объект из памяти (если только он не знает, что это действительно никогда не упоминаются нигде в программе). – AnT

+0

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

0

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

0

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

3

Это зависит.

const int a = 5; 

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

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

static const int a = 5; 

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

extern const int a; 
-1

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

1

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

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

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

0

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

MOV EAX, 5

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

Смежные вопросы