Где хранятся временные объекты?
Где хранятся временные объекты-константы? Знаю, что у констант, таких что не объявленных, то адреса нет, кроме строковых литералов, например:
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- на стеке.- Про строковые литералы по выводу дизассемблера не очень понятно. Думаю правильно будет сказать, что они находятся "в сегменте данных" (см. ссылку про сегменты выше). Явно не в стеке - объекты на стеке уничтожаются при выходе из функции, а строковые литералы существуют все время работы программы.