Страницы

Поиск по вопросам

вторник, 26 ноября 2019 г.

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


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

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, без всякого хранения.

Комментариев нет:

Отправить комментарий