考虑以下程序:

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/

10-13 08:17