Как хранятся в памяти литералы?
int main() {
5;
1.;
"";
}
Ответы
Ответ 1
С абстрактной точки зрения "в памяти" в языке С++ хранятся только lvalues. Из приведенных вами литералов только строковый литерал "" является lvalue, т.е. только он хранится в памяти.
Остальные литералы не являются lvalue и формально положения в памяти не имеют.
Фактически же целочисленные литералы обычно "встраиваются" в тот контекст, в которо
они использованы. Они могут встроиться непосредственно в сгенерированную машинную команд
(то есть стать частью кода, а не данных программы), а могут вообще неузнаваемо трансформироваться или бесследно раствориться в этом контексте: умножение на 8 может замениться на сдвиг влево на 3 разряда, а присваивание переменной значения 0 может замениться на машинную инструкцию обнуления.
Что произойдет с литералом с плавающей точкой — зависит от способностей компилятор
и особенностей подлежащей машинной платформы. На платформе x86 в общем случае плавающи
литерал действительно будет храниться в памяти, т.е. для его хранения будет заведена внутренняя переменная. В то же время компилятор вправе распознавать "особенные" плавающие константы (0.0, 1.0 и т.д.) и реализовывать их неявным образом. Но, еще раз, в любом случае на уровне языка плавающий литерал положения в памяти не имеет.
Ответ 2
Арифметические литералы не хранятся в памяти, а встраиваются в объектный код.
Строковые литералы хранятся обычно в отдельном пуле литералов, так как они имею
статическую длительность используемой памяти. Одинаковые строковые литералы могут храниться как один литерал, либо как отдельные литералы в зависимости от опций компилятора.
Поэтому данное выражение в if предложении
if ( "A" == "A" ) { /* ... */ }
может иметь значение как true, если эти два литерала хранятся как один литерал, т
есть имеют один и тот же адрес, так и false, если компилятор хранит каждый из этих литералов в отдельном участке памяти.
Что касается этой программы
int main() {
5;
1.;
"";
}
то так как данные предложения выражений не имеют побочных эффектов, то для них может вообще не генерироваться никакой объектный код.
Ответ 3
Да никак... Пока они не использованы - для инициализации переменной, например, ил
там в вызове функции. И то они могут не храниться - например, какое-нибудь a >>= 2 просто превратится в машинную команду, в которой просто указано непосредственное значение 2, без всякого хранения.
Комментариев нет:
Отправить комментарий