Где хранится временный объект? - PullRequest
10 голосов
/ 02 февраля 2012

Временные объекты IMO хранятся в динамической (куче) памяти, но я не уверен. Можете ли вы подтвердить или опровергнуть мои мысли?

Ответы [ 4 ]

7 голосов
/ 02 февраля 2012

Стандарт не требует для них какой-либо области памяти (кучи / стека), но они подобны локальным переменным «автоматическое хранение», то есть в конце выражения (или длиннее, когда связаны с ref-to- const) они разрушены.

Большинство реализаций будет хранить их в стеке, как локальные переменные.

редактирование:

Как отметил Джеймс Канзе: в случае, когда срок службы временного элемента увеличивается с помощью ref-to-const, его расположение в большинстве реализаций в некоторой степени определяется местом хранения этой ссылки. То есть, в случае, когда ссылка находится в статическом хранилище, временное тоже будет (только что подтверждено на gcc). (Хотя ИМХО в то время как это все еще временным в стандартах смысле можно утверждать, является ли это временным в интуитивном английском смысле этого слова)

5 голосов
/ 02 февраля 2012

Это зависит от их срока службы.Временные файлы, которые вы создаете внутри функции, которую вы не привязываете к локальной статической ссылке, чтобы продлить срок их службы, скорее всего, будут созданы в стеке.Временные ссылки, которые вы привязываете к локальным статическим ссылкам, скорее всего, будут храниться в разделе .data вашего двоичного файла программы.То же самое относится и к временным ссылкам, которые вы привязываете к нелокальным ссылкам.Временные значения, созданные во время инициализации нелокальной переменной, отличной от той, с которой связана ссылка, должны находиться в стеке функции, которая создает значение этой нелокальной переменной.

Объекты исключений, которые представляют брошенный объект во времяразматывать тоже временные.Те, которые обычно находятся в куче.

4 голосов
/ 02 февраля 2012

Это сильно зависит от реализации, но они, вероятно, находятся в автоматическом хранилище .

Обратите внимание, что область действия может быть нелогичной из-за оптимизации.

Следующее:

class A
{
//...
};

//....

A foo()
{
   A a;
   return a;
}

Здесь объект a не обязательно находится только внутри области действия функции, но может произойти RVO.

Кроме того, при передаче по значению временного объекта он может не разрушиться сразу.

void foo(A a);
//...

foo( A() );

Здесь временный объект не обязательно присутствует только в этой строке, но может быть создан непосредственно в стеке аргументов метода.

0 голосов
/ 02 февраля 2012

Большинство (если не все) реализации хранят их в стеке (т.е. автоматическое хранение), хотя я нигде не думаю о стандартных мандатах.Конечно, сделать это проще, поскольку компилятор должен гарантировать время жизни временной переменной, и вполне возможно, что указанное время жизни будет включать в себя рекурсивный вызов той же функции, создавая другой экземпляр временной переменной.

...