【C++】函数的返回值是类的对象时,有些编译器会进行优化

本文探讨了GCC和MSVC编译器在处理函数返回类对象时的不同行为,特别关注它们是否调用拷贝构造/移动构造和赋值函数。实例展示了在Qt和VS环境下,这两种编译器对于存在或缺失移动构造函数的MyMap类的不同输出结果。
摘要由CSDN通过智能技术生成

函数的返回值是类的对象时,GCC编译器会进行优化(不调用拷贝构造函数或移动构造函数),而MSVC编译器不会。

以下例子分别在下面环境运行通过:

  • ①Qt5.7.0,mingw5.3.0,debug模式;
  • ②Visual Studio 2015,debug模式.

理论可供学习研究,但是具体情况还是要靠实践!

#include <map>
#include <iostream>

using namespace  std;

template <class Key, class T>
class MyMap : public map<Key,T>
{
public:
    MyMap() : map<Key,T>()
    {
        cout << "Ctor" << endl;
    }

    ~MyMap()
    {
        cout << "DeCtor" << endl;
    }

    MyMap(const MyMap<Key, T> &other) : map<Key,T>(other)
    {
        cout << "Copy Ctor" << endl;
    }

    MyMap& operator=(const MyMap<Key, T> &demoClassTmp)
    {
        cout << "Copy Assignment" << endl;
        return map<Key,T>::operator =(demoClassTmp);;
    }

    MyMap(const MyMap<Key, T> &&other) : map<Key,T>(other)
    {
        cout << "Move Ctor" << endl;
    }

    MyMap& operator=(const MyMap<Key, T> &&demoClassTmp)
    {
        cout << "Move Assignment" << endl;
        return map<Key,T>::operator =(demoClassTmp);;
    }
};

MyMap<int,int> getMapCopy()
{
    MyMap<int,int> m;
    m[1] = 1;
    return m;
}

int main(int argc, char *argv[])
{
	cout << "=================map====================" << endl;

	{
		MyMap<int, int> d = getMapCopy();
	}

	cout << "=======================================" << endl;

	{
		MyMap<int, int> d = std::move(getMapCopy());
	}

	system("pause");
	return 0;
}
①GCC编译器,当MyMap有移动构造和移动赋值函数时,输出结果为:
=================map====================
Ctor
DeCtor
=======================================
Ctor
Move Ctor
DeCtor
DeCtor

①GCC编译器,当MyMap没有移动构造和移动赋值函数时,输出结果为:
=================map====================
Ctor
DeCtor
=======================================
Ctor
Copy Ctor
DeCtor
DeCtor

③MSVC编译器,当MyMap有移动构造和移动赋值函数时,输出结果为:
=================map====================
Ctor
Move Ctor
DeCtor
DeCtor
=======================================
Ctor
Move Ctor
DeCtor
Move Ctor
DeCtor
DeCtor

④MSVC编译器,当MyMap没有移动构造和移动赋值函数时,输出结果为:
=================map====================
Ctor
Copy Ctor
DeCtor
DeCtor
=======================================
Ctor
Copy Ctor
DeCtor
Copy Ctor
DeCtor
DeCtor
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值