临时对象存储在哪里

Where are temporary object stored?

本文关键字:在哪里 存储 临时对象      更新时间:2023-10-16

临时对象确实存储在动态(堆)内存中吗?

标准没有为它们指定任何内存区域(堆/堆栈),但它们就像局部变量"自动存储"一样,也就是说,在表达式的末尾(或绑定到ref到const时更长的时间),它们被销毁。

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

编辑:

正如James Kanze所指出的:在临时的生存期通过ref扩展到const的情况下,它的存储位置在大多数实现中都是由该引用的存储位置决定的。也就是说,在引用位于静态存储中的情况下,临时也将是(刚刚在gcc上确认)。(尽管IMHO虽然这在标准意义上仍然是暂时的,但在该词的直观英语意义上这是否是暂时的还有争议)

这取决于它们的使用寿命。你在一个函数内部创建的临时函数,如果你没有绑定到本地静态引用来延长它们的使用寿命,那么它们很可能会在堆栈上创建。绑定到本地静态引用的临时文件很可能存储在程序二进制文件的.data部分。对于绑定到非本地引用的临时引用也是如此。在初始化非局部变量期间创建的临时变量,而不是通过引用绑定到的非局部变量,应该在生成该非局部变量值的函数的堆栈上。

表示展开过程中抛出的对象的异常对象也是临时对象。那些通常堆在堆里。

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

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

以下内容:

class A
{
//...
};
//....
A foo()
{
   A a;
   return a;
}

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

此外,当传递临时对象的值时,它可能不会立即被销毁。

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

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

大多数(如果不是全部的话)实现都将它们存储在堆栈上(即自动存储),尽管我认为标准并没有强制执行。这样做当然更容易,因为编译器必须保证临时变量的生存时间,而且所述生存时间可能包括对同一函数的递归调用,从而创建临时变量的另一个实例。