暂时对象是否存储在动态(堆)内存中?(参考链接)
这个标准没有规定任何内存区域(堆栈)供它们使用,但它们就像本地变量一样,“自动存储”,也就是在表达式结束时(或者绑定到一个ref-to-const时更长时间),它们就被销毁了。
大多数实现将它们存储在堆栈中,就像本地变量一样。
编辑:
正如James Kanze所指出的:如果通过ref-to-const扩展一个临时对象的生命周期,它的存储位置在大多数实现中有点取决于该引用的存储位置。也就是说,在引用位于静态存储区时,临时对象也会位于静态存储区(在gcc上刚刚确认)。虽然在标准意义上仍然是一个临时对象,但我认为它在直观的英语意义上是否为临时对象是可以争议的。
在解除异常期间表示抛出对象的异常对象也是临时变量。这些通常驻留在堆上。
这高度依赖于实现,但它们可能驻留在自动存储中。
请注意,由于优化的原因,范围可能令人感到违反直觉。
以下内容:
class A
{
//...
};
//....
A foo()
{
A a;
return a;
}
a
不一定仅存在于函数的作用域中,但是RVO可能会发生。void foo(A a);
//...
foo( A() );
在这里,临时变量不一定只存在于该行中,而可以直接构造在方法的参数栈中。
大多数(如果不是全部)的实现都将它们存储在堆栈上(即自动存储),尽管我认为标准没有规定任何地方。像这样做肯定更容易,因为编译器必须保证临时变量的生命周期,并且可能会出现同一函数的递归调用,创建另一个临时变量实例。
foo();
返回后继续存在吗?你能引用标准中允许这种情况发生的部分吗? - PlasmaHHstatic MyType const& x = MyType();
。在这种情况下(也是我能想到的唯一一种情况),临时变量可能与静态数据在同一空间中。 - James Kanze