临时对象存储在哪里
Where are temporary object stored?
临时对象确实存储在动态(堆)内存中吗?
标准没有为它们指定任何内存区域(堆/堆栈),但它们就像局部变量"自动存储"一样,也就是说,在表达式的末尾(或绑定到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() );
在这里,临时不一定只在该行中活动,而是可以直接在方法的参数堆栈中构造。
大多数(如果不是全部的话)实现都将它们存储在堆栈上(即自动存储),尽管我认为标准并没有强制执行。这样做当然更容易,因为编译器必须保证临时变量的生存时间,而且所述生存时间可能包括对同一函数的递归调用,从而创建临时变量的另一个实例。
- 谷歌测试中的期望值存储在哪里
- 常量参数存储在哪里 (C++)?
- 此递归函数的每次迭代的值存储在哪里?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在哪里存储跨平台C++应用存储?
- 模板参数在 C++ 中存储在哪里?
- 存储在 C++ 编译器中的标识符的定义(不是声明)在哪里?
- 变量或标识符存储在C++中究竟在哪里?
- C++ - thread_local变量存储在哪里?
- 返回值存储在哪里?
- Cmake忽略了我所有关于在boost::beast存储库中在哪里找到提升的指令
- glVertexAttribDivisor 存储在哪里 - VAO、VBO 或全局状态?
- 虚拟函数在哪里使用 vpointer to vtable 来解析方法调用,非虚拟方法存储在哪里以及如何解析它们?
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 如果不在内存中,则在哪里存储表达式和常数
- C 在哪里存储固定大小数组的大小
- 在哪里存储Visitor模式中访问的每个元素的计算结果
- winsock在哪里存储套接字的ip地址?
- 在哪里存储用于OSX部署的Qt导入
- PST 文件中的日历邮件在哪里存储约会时间和日期