加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:32:17 所属栏目:百科 来源:网络整理
导读:在以下代码中,它打印出两个不同的内存位置.这对我来说很有意义,因为我正在以价值回归. #include iostreamusing namespace std;class Foo {public: Foo () {}// Foo (const Foo ) { cout "Copy con" endl; }};Foo test () { Foo foo; cout foo endl; return f
在以下代码中,它打印出两个不同的内存位置.这对我来说很有意义,因为我正在以价值回归.

#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;
}

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

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

解决方法

这是 return value optimization的结果.基本上,您的编译器省略了由return语句导致的昂贵的复制操作,即使复制构造函数有副作用.

这背后的原因是返回一个复杂的对象是很容易的.编译器不会浪费时间进行复制,而是在调用者的堆栈帧中秘密创建隐藏对象,并将对该隐藏对象的引用传递给被调用函数,并将函数的返回值直接复制到该隐藏对象中.

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读