16

临时对象是否存储在动态(堆)内存中?

4

4 回答 4

10

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

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

编辑:

正如 James Kanze 指出的那样:在临时的生命周期通过 ref-to-const 延长的情况下,它的存储位置在大多数实现中在某种程度上取决于该引用的存储位置。也就是说,在引用在静态存储中的情况下,临时也将是(刚刚在 gcc 上确认)。(尽管恕我直言,虽然这在标准意义上仍然是暂时的,但在该词的直观英语意义上这是否是暂时的还是有争议的)

于 2012-02-02T09:27:43.837 回答
7

这取决于他们的一生。您在未绑定到本地静态引用以延长其生命周期的函数内部创建的临时对象很可能会在堆栈上创建。绑定到本地静态引用的临时文件很可能存储在程序二进制文件的 .data 部分中。同样适用于绑定到非本地引用的临时对象。在非局部变量初始化期间创建的临时变量(由引用绑定的变量除外)应位于生成该非局部变量值的函数的堆栈上。

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

于 2012-02-02T09:49:07.457 回答
4

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

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

以下:

class A
{
//...
};

//....

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

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

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

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

foo( A() );

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

于 2012-02-02T09:27:08.593 回答
0

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

于 2012-02-02T09:31:08.230 回答