C++编译优化备忘

时间:2023-03-09 05:45:20
C++编译优化备忘

基于GCC测试:http://www.tutorialspoint.com/compile_cpp11_online.php

const A& a=fun() 与 A a= fun()

1、方法fun返回值为 const A& 时,前者比后者 减少一次拷贝构造

 #include <iostream>

 using namespace std;

     class  A
{ public: A() {
cout << "--默认构造函数--" << endl;
} A(const A& a) { cout << "--拷贝构造函数--" << endl; } A & operator =(const A &a)
{
cout << "--赋值--" << endl;
return *this;
}
}; class Test
{
public:
const A& GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
A vec;
cout << "------" << endl;
A a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
const A& b=t.GetA();
cout <<&b << endl;
return ;
}

const &

C++编译优化备忘

2、方法fun返回值为 A 时,相同。只会生成一个临时变量

 A GetA(){ cout <<&m_a << endl; return m_a;}

  C++编译优化备忘

 A GetA(){ A a;cout <<&a << endl; return a;}

  C++编译优化备忘

未实现move构造的类:A a=std::move(fun()) 与  A a=fun()

1、方法fun返回值为 const A& 时,相同,都调用一次拷贝构造

 class Test
{
public:
const A& GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
cout << "------" << endl;
A a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
A b=std::move(t.GetA());
cout <<&b << endl;
return ;
}

move

C++编译优化备忘

2、方法fun返回值为 A,前者比后者多一次拷贝构造

 class Test
{
public:
A GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
cout << "------" << endl;
A a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
A b=std::move(t.GetA());
cout <<&b << endl;
return ;
}

move

C++编译优化备忘

未实现move构造的类:A a;a=std::move(fun()) 与  A a;a=fun()

与fun的返回值无关,均相同

 class Test
{
public:
A GetA(){ cout <<&m_a << endl; return m_a;} private:
A m_a;
}; int main()
{
Test t;
cout << "------" << endl;
A a;
a=t.GetA();
cout <<&a << endl;
cout << "------" << endl;
A b;
b=std::move(t.GetA());
cout <<&b << endl;
return ;
}

赋值

C++编译优化备忘

  const A& GetA(){ cout <<&m_a << endl;  return m_a;}

const A&

C++编译优化备忘