Как хранятся в памяти литералы?

309
26 января 2017, 02:59

Как хранятся в памяти литералы?

int main() {
  5;
  1.;
  "";
}
Answer 1

С абстрактной точки зрения "в памяти" в языке С++ хранятся только lvalues. Из приведенных вами литералов только строковый литерал "" является lvalue, т.е. только он хранится в памяти.

Остальные литералы не являются lvalue и формально положения в памяти не имеют.

Фактически же целочисленные литералы обычно "встраиваются" в тот контекст, в котором они использованы. Они могут встроиться непосредственно в сгенерированную машинную команду (то есть стать частью кода, а не данных программы), а могут вообще неузнаваемо трансформироваться или бесследно раствориться в этом контексте: умножение на 8 может замениться на сдвиг на 3, а присваивание переменной значения 0 может замениться на машинную инструкцию обнуления.

Что произойдет с литералом с плавающей точкой - зависит от способностей компилятора и особенностей подлежащей машинной платформы. На платформе x86 в общем случае плавающий литерал действительно будет храниться в памяти, т.е. для его хранения будет заведена внутренняя переменная. В то же время компилятор вправе распознавать "особенные" плавающие константы (0.0, 1.0 и т.д.) и реализовывать их неявным образом. Но, еще раз, в любом случае на уровне языка плавающий литерал положения в памяти не имеет.

Answer 2

Арифметические литералы не хранятся в памяти, а встраиваются в объектный код. Строковые литералы хранятся обычно в отдельном пуле литералов, так как они имеют статическую длительность используемой памяти. Одинаковые строковые литералы могут храниться как один литерал, либо как отдельные литералы в зависимости от опций компилятора.

Поэтому данное выражение в if предложении

if ( "A" == "A" ) { /* ... */ }

может иметь значение как true, если эти два литерала хранятся как один литерал, то есть имеют один и тот же адрес, так и false, если компилятор хранит каждый из этих литералов в отдельном участке памяти.

Что касается этой программы

int main() {
  5;
  1.;
  "";
}

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

Answer 3

Да никак... Пока они не использованы - для инициализации переменной, например, или там в вызове функции. И то они могут не храниться - например, какое-нибудь a >>= 2 просто превратится в машинную команду, в которой просто указано непосредственное значение 2, без всякого хранения.

READ ALSO
Как построить native android программу через cmd в Windows? [требует правки]

Как построить native android программу через cmd в Windows? [требует правки]

Какиеexe нужно использовать? Из папки x86_64 или arm-linux-androideabi или других? и т

278
Переопределение макроса

Переопределение макроса

Подскажите, можно ли определить макрос так, чтобы в зависимости от того, использовался он, или нет, он принимал разные значения ?

310
Запустить .exe файлы c++

Запустить .exe файлы c++

Подскажите, пожалуйстаМне нужно создать 2 exe-файла: test1

323