考虑以下程序:
class C {
...
};
const C f() {
C ret;
cout << &ret << endl;
return ret;
}
int main() {
C value = f();
cout << &value << endl;
}
result: // note the address are the same
0x7ffdd24b26e0
0x7ffdd24b26e0
函数f()中的变量“ret”和变量“value”具有相同的内存地址,因此似乎“value”不是“ret”的副本。变量“ret”是一个堆栈变量,因此应在f()返回后使其无效。那么,为什么c++允许在函数内部返回堆栈值?
g++版本:
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
最佳答案
ret地址和值的地址相同的原因是所谓的返回值优化(RVO)。这意味着在这种情况下将不执行复制。但是请注意,您不能依靠它,因为它不一定会发生(尽管随着C++ 17的改变(至少是当前草案))。
https://en.wikipedia.org/wiki/Return_value_optimization
关于c++ - 为什么C++中的函数可以返回堆栈值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38213136/