考虑以下程序:
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的改变(至少是当前草案))。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句