Правда ли, что временные объекты хранятся в динамической памяти (куче)?
Где хранятся временные объекты?
Ответы (4)
Стандарт не требует для них какой-либо области памяти (кучи/стека), но они аналогичны локальным переменным «автоматического хранения», то есть в конце выражения (или дольше, когда они связаны с ref-to-const). разрушаются.
Большинство реализаций будут хранить их в стеке, как локальные переменные.
изменить:
Как отметил Джеймс Канце: «В случае, если время жизни временного объекта продлевается с помощью ссылки на константу, его место хранения в большинстве реализаций в некоторой степени определяется местом хранения этой ссылки. То есть в случае, если ссылка находится в статическом хранилище, временная тоже будет (просто подтверждена на gcc). (хотя ИМХО, хотя это все еще временно в смысле стандартов, спорно, является ли это временным в интуитивном английском смысле этого слова)
foo();
? Вы можете привести цитату из стандарта, где это разрешено?
- person PlasmaHH; 02.02.2012
foo( A() )
временное может быть построено непосредственно в области действия функции и использовано в функции напрямую вместо создания копии.
- person Luchian Grigore; 02.02.2012
int x = foo();
имеет неправильный формат, поскольку возможно, что временное, созданное с помощью foo()
, удаляется до инициализации x => это не является неправильным, поскольку приведенное выше выражение не имеет неправильного формата.
- person Mihran Hovsepyan; 02.02.2012
return A();
, а временное не копировать и не уничтожать, так как может произойти оптимизация возвращаемого значения. Поищи это.
- person Luchian Grigore; 02.02.2012
static MyType const& x = MyType();
. В этом случае (и это единственный случай, который я могу придумать) временные данные, вероятно, будут находиться в том же пространстве, что и статические данные.
- person James Kanze; 02.02.2012
Это зависит от срока их службы. Временные объекты, которые вы создаете внутри функции, которую вы не привязываете к локальной статической ссылке, чтобы продлить их время жизни, скорее всего, будут созданы в стеке. Временные файлы, которые вы привязываете к локальным статическим ссылкам, скорее всего, будут храниться в разделе .data двоичного файла вашей программы. То же самое относится и к временным объектам, которые вы привязываете к нелокальным ссылкам. Временные объекты, созданные во время инициализации нелокальной переменной, отличной от той, к которой привязана ссылка, должны находиться в стеке функции, которая создает значение этой нелокальной переменной.
Объекты-исключения, представляющие выброшенный объект во время раскручивания, также являются временными. Обычно они находятся в куче.
Это сильно зависит от реализации, но они, вероятно, находятся в автоматическом хранилище.
Обратите внимание, что область действия может быть нелогичной из-за оптимизации.
Следующее:
class A
{
//...
};
//....
A foo()
{
A a;
return a;
}
Здесь объект a
не обязательно находится только внутри области действия функции, но может иметь место RVO.
Кроме того, при передаче по значению временного объекта он может быть уничтожен не сразу.
void foo(A a);
//...
foo( A() );
Здесь временное не обязательно находится только в этой строке, но может быть создано непосредственно внутри стека аргументов метода.
Большинство (если не все) реализаций хранят их в стеке (т.е. в автоматическом хранилище), хотя я не думаю, что стандарт где-либо предписывает. Это, безусловно, проще сделать так, поскольку компилятор должен гарантировать время жизни временной переменной, и возможно, что указанное время жизни будет охватывать рекурсивный вызов той же функции, создавая другой экземпляр временной переменной.