临时对象存放在哪里?

Mih*_*yan 11 c++ temporary-objects

IMO临时对象存储在动态(堆)内存中,但我不确定.你能否确认或否认我的想法?

Pla*_*aHH 8

该标准并未强制要求任何内存区域(堆/堆栈),但它们就像局部变量"自动存储",即表达式的末尾(或绑定到ref-to-const时更长)被毁坏了.

大多数实现都会像局部变量一样将它们存储在堆栈中.

编辑:

正如James Kanze指出的那样:在临时的生命周期通过ref-to-const扩展的情况下,其存储位置在大多数实现上由该引用的存储位置决定.也就是说,在引用处于静态存储的情况下,临时也是(仅在gcc上确认).(虽然恕我直言,虽然这在标准意义上仍然是暂时的,但这是否是直觉英语意义上的这个词是暂时的)

  • 有几种情况几乎可以肯定它不在堆栈上.考虑类似`static MyType const&x = MyType();`.在这种情况下(它是我能想到的唯一一个),临时可能与静态数据在同一空间. (2认同)

Joh*_*itb 5

这取决于他们的一生.您在函数内部创建的Temporaries很可能是在堆栈上创建的,您不会将其绑定到本地静态引用以延长其生命周期.绑定到本地静态引用的临时存储器很可能存储在程序二进制文件的.data部分中.对于绑定到非本地引用的临时对象也是如此.在初始化非局部变量期间创建的临时变量,除了由引用绑定的变量之外,应该在产生该非局部变量值的函数的堆栈上.

在展开期间表示抛出对象的异常对象也是临时对象.那些通常驻留在堆上.


Luc*_*ore 4

这高度依赖于实现,但它们可能驻留在自动存储中。

请注意,由于优化,范围可能是违反直觉的。

下列:

class A
{
//...
};

//....

A foo()
{
   A a;
   return a;
}
Run Code Online (Sandbox Code Playgroud)

在这里,对象a不一定只驻留在函数的作用域内,但 RVO 可能会发生。

此外,当按值传递临时对象时,它可能不会立即被破坏。

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

foo( A() );
Run Code Online (Sandbox Code Playgroud)

在这里,临时变量不一定只存在于该行中,而是可以直接在方法的参数堆栈内构造。