Где хранятся временные объекты?

Где хранятся временные объекты-константы? Знаю, что у констант, таких что не объявленных, то адреса нет, кроме строковых литералов, например:

printf("%d", 5); // Где хранится константа? В регистре процессора? Адреса у нее нет.
int value = 10; // Аналогично

printf("%s", "I am just a string"); // Адрес у строки есть, но где она хранится? На стеке?

Если можно, то простым языком) Спасибо!


Ответы (1 шт):

Автор решения: HolyBlackCat

Стандарты C/C++ описывают только как ведут себя те или иные конструкции этих языков. Что происходит у программы "под капотом" в них не написано, поэтому зависит от компилятора. Сюда входит:

  • Что помещается в регистры (или куда-то еще), а что нет.
  • Существование стека и кучи. В стандарте написано только как долго существуют объекты, созданные тем или иным образом. Где они при этом находятся - не написано.
    (Хотя это занудство... На практике new создает объекты в куче, локальные переменные создаются в стеке, и т. д.)

Если хочется чего-то менее формального и более практичного, почитайте про сегменты объектных файлов.

Можете засунуть ваш код в дизассемблер (результат будет зависеть от выбора компилятора и флажков для него).

У меня получилось вот что:

  • Константы 5 и 10 стали частью инструкций mov ().
    mov esi, 5
    ...
    mov dword ptr [rbp - 4], 10
    
  • value - на стеке.
  • Про строковые литералы по выводу дизассемблера не очень понятно. Думаю правильно будет сказать, что они находятся "в сегменте данных" (см. ссылку про сегменты выше). Явно не в стеке - объекты на стеке уничтожаются при выходе из функции, а строковые литералы существуют все время работы программы.
→ Ссылка