Литералы: они занимают память? - PullRequest
2 голосов
/ 24 ноября 2011

а:

4;
4.0f;
"text";

б

4.0/5.3;
1.0f*2.3f+3.5f;
"super" + "man";

Вопросы

1) Этот код занимает память?

2) Занимает ли код в b больше памяти, чем код в a?

3) Может ли кто-нибудь подробно объяснить, что происходит внутри?

EDIT: «супер» + «человек» - плохой пример, он не совсем корректен. (спасибо Майклу Крелину) Во-вторых, вставлять строки в пример было плохой идеей.

Ответы [ 4 ]

3 голосов
/ 24 ноября 2011

Это зависит от компилятора, архитектуры компьютера и т. Д.

Скорее всего, компилятор вычислит значения этих выражений во время компиляции, если будет уверен, что результат всегда одинаков.Затем результат выражения может быть помещен непосредственно в выходной файл вместо инструкций, необходимых для вычисления результата.Но, насколько мне известно, компилятору не требуется выполнять такие виды оптимизации.

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

2 голосов
/ 24 ноября 2011

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

2 голосов
/ 24 ноября 2011

1) Этот код занимает память?

Да

2) Занимает ли код в b больше памяти, чем код в a?

Зависит от машинного кода, полученного от компилятора. Вероятно, это так.

3) Может ли кто-нибудь подробно объяснить, что происходит внутри?

Прочтите о сегменте кода и сегменте данных .

1 голос
/ 24 ноября 2011
  1. Это не код, но если он используется в коде, его следует поместить где-то .
  2. Нет, он оценивается во время компиляции, за исключением "super" + "man", который просто неверен, он должен быть "super" "man" для конкатенации во время компиляции. И «супермен» больше, чем «текст». Также как «4» (целое число) может занять меньше, чем «4,0 / 5,3» (число с плавающей запятой).
  3. Внутренний компилятор оценивает константные выражения и помещает их куда-то . Остальное зависит от того, что вы называете «памятью». Это где-то в адресном пространстве вашей программы.
...