对C++临时对象的内存位置的研究

本文探讨了C++中临时对象的内存位置问题,通过分析运算中的临时对象、参数上的临时对象以及返回值上的临时对象,揭示它们可能存在于栈内,并通过反汇编示例解释了函数返回值如何使用栈空间,揭示了一个鲜为人知的实现细节。
摘要由CSDN通过智能技术生成
首先,这是一个很少有人研究的问题:C++的临时对象是在堆里还是在栈里的。
但若不研究清楚内部原理,每次产生临时量时都会纠结于此,
网上能找到的资料也都是new在堆里、定义在函数内部就是栈里,或者是临时量通过复制构造函数构造这种废话。。。
所以自己研究了一下……


首先,运算中的临时对象显然是栈内的,
对于参数上的临时对象,我推测是直接push进去的,应该也在栈内,
但是返回值上的临时对象就很让人费解了,应该是用rax传的地址,空间从哪来的呢。。
如果是new出来的空间,调用方如何确定合适的时机来delete以免内存泄漏?
如果是在函数栈内的,那函数结束后就不能保证原栈空间不被覆盖了。。。


#include <cstdio>
#include <cstdlib>
using namespace std;


struct test {
  int a,b;
  long long asd;
};


test f(test aaa) {
  test faf={0};
  return faf;
}
void g() {
test k;
  f(k);


}
int main() {
g();
return 0;
}


对三个函数反汇编看看。。
f函数:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值