gpt4 book ai didi

c++ - 复制构造函数的存在导致函数通过引用而不是值返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:12:01 24 4
gpt4 key购买 nike

在下面的代码中,它打印出两个不同的内存位置。这对我来说很有意义,因为我按值(value)返回。

#include <iostream>

using namespace std;

class Foo {
public:
Foo () {}
// Foo (const Foo &) { cout << "Copy con" << endl; }
};

Foo test () {
Foo foo;
cout << &foo << endl;
return foo;
}

int main () {
Foo foo = test();
cout << &foo << endl;
}

但是,如果我在上面的代码中取消注释复制构造函数并再次运行它,它会输出相同的内存位置两次。为什么?它根本不打印出“Copy con”,所以我知道没有调用复制构造函数。复制构造函数的存在似乎会导致某种优化,即使它没有被调用。

我正在 GCC 4.6.3 上使用“g++ -Wall test.cpp -o test”进行编译。

最佳答案

这是 return value optimization 的结果.基本上,您的编译器会忽略 return 语句导致的代价高昂的复制操作,即使复制构造函数有副作用。

这背后的原因是返回一个复杂的对象是昂贵的。编译器没有将时间浪费在复制上,而是 secret 地在调用者堆栈帧中创建一个隐藏对象,并将对该隐藏对象的引用传递给被调用函数,函数的返回值直接复制到那个隐藏的物体。

C++ 标准明确说明了这一点(ISO-IEC 14882:2011 12.8 第 31 段):

When certain criteria are met, an implementation is allowed to omit the copy/move construction of a class object, even if the copy/move constructor and/or destructor for the object have side effects.

关于c++ - 复制构造函数的存在导致函数通过引用而不是值返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12386805/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com