IMO临时对象存储在动态(堆)内存中,但我不确定。你能否确认或否认我的想法?
答案 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)
大多数(如果不是全部)实现将它们存储在堆栈上(即自动存储),尽管我不认为标准要求在任何地方。这样做当然更容易,因为编译器必须保证临时变量的生命周期,并且所述生命周期可能包含对同一函数的递归调用,从而创建临时变量的另一个实例。