首先,这是一个很少有人研究的问题: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函数:
但若不研究清楚内部原理,每次产生临时量时都会纠结于此,
网上能找到的资料也都是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函数: