临时对象存放在哪里?

时间:2012-02-02 09:25:24

标签: c++ temporary-objects

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

4 个答案:

答案 0 :(得分:7)

标准没有为它们强制要求任何内存区域(堆/堆栈),但它们就像局部变量“自动存储”一样,即在表达式的末尾(或者当绑定到ref-to时更长) const)它们被破坏了。

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

修改

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

这是高度依赖于实现的,但它们可能位于自动存储

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

以下内容:

class A
{
//...
};

//....

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

这里,对象a不一定只驻留在函数的范围内,但可以发生RVO。

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

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

foo( A() );

这里,临时不一定只在该行中存活,但可以直接在方法的参数堆栈中构造。

答案 3 :(得分:0)

大多数(如果不是全部)实现将它们存储在堆栈上(即自动存储),尽管我不认为标准要求在任何地方。这样做当然更容易,因为编译器必须保证临时变量的生命周期,并且所述生命周期可能包含对同一函数的递归调用,从而创建临时变量的另一个实例。