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