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

Вы могли использовать wtime:

wtime [ -t task ] [  ]

-t  task
    Specify the name of the task. It has to be  a  valid  file-
    name.  Only the first 32 characters are taken into account.
    The default value is "default".

action is one of the following:

-h  Display help.

-a  Start counting.

-s  Stop counting.

-c  Display current elapsed time in seconds.

-r  [ start [ end ]]
    Display time spent on the task during the  specified
    period.  The  parametres start and end represent the
    begginning and end of the reporting  period  respec-
    tively.  The  format  of start and end is '%d-%m-%Y'
    (see strptime (1)).  The default values are the cur-
    rent  time for end and the begginning of the current
    month for the start parameter.

12
задан mauris 3 November 2009 в 16:30
поделиться

9 ответов

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

Например:

const int a = 4;

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

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

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

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

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

1
ответ дан 2 December 2019 в 18:19
поделиться

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

15
ответ дан 2 December 2019 в 18:19
поделиться

Это зависит.

const int a = 5;

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

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

static const int a = 5;

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

extern const int a;
3
ответ дан 2 December 2019 в 18:19
поделиться

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

0
ответ дан 2 December 2019 в 18:19
поделиться

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

1
ответ дан 2 December 2019 в 18:19
поделиться

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

0
ответ дан 2 December 2019 в 18:19
поделиться

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

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

Кроме того, это означает, что в C у константного объекта очень мало шансов быть «удаленным», как утверждают другие ответы. Если вы действительно хотите, чтобы он был «съемным» в C, вы должны явно объявить его как static . Но даже в этом случае объект const int не будет формировать постоянные выражения, т.е. вы все равно можете '

1
ответ дан 2 December 2019 в 18:19
поделиться

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

-1
ответ дан 2 December 2019 в 18:19
поделиться

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

mov eax, 5

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

0
ответ дан 2 December 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: