对象拷贝时的编译器优化(C++)

打印 上一主题 下一主题

主题 1022|帖子 1022|积分 3066

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 相识编译器优化

  1. 现代编译器会为了尽可能提高程序的服从,在不影响正确性的情况下会尽可能减少一些传参和        传参过程中可以省略的拷贝
2. 如何优化C++尺度并没有严酷规定,各个编译器会根据情况自行处理处罚。当前主流的相对新一点        的编译器对于连续一个表达式步骤中的连续拷贝会进行合并优化,有些更新更"激进"的编译还        会进行跨行跨表达式的合并优化
 
 
  1. #include<iostream>
  2. using namespace std;
  3. class A
  4. {
  5. public:
  6.         A(int a = 0)
  7.                 :_a1(a)
  8.         {
  9.                 cout << "A(int a)" << endl;
  10.         }
  11.         A(const A& aa)
  12.                 :_a1(aa._a1)
  13.         {
  14.                 cout << "A(const A& aa)" << endl;
  15.         }
  16.         A& operator=(const A& aa)
  17.         {
  18.                 cout << "A& operator=(const A& aa)" << endl;
  19.                 if (this != &aa)
  20.                 {
  21.                         _a1 = aa._a1;
  22.                 }
  23.                 return *this;
  24.         }
  25.         ~A()
  26.         {
  27.                 cout << "~A()" << endl;
  28.         }
  29. private:
  30.         int _a1 = 1;
  31. };
  32. void f1(A aa)//传值调拷贝构造函数
  33. {}
  34. A f2()
  35. {
  36.         A aa;
  37.         return aa;
  38. }
  39. int main()
  40. {
  41.         // 传值传参
  42.         A aa1;
  43.         f1(aa1);
  44.         cout << endl;
  45.         // 隐式类型,连续构造+拷⻉构造->优化为直接构造
  46.         f1(1);
  47.         // ⼀个表达式中,连续构造+拷⻉构造->优化为⼀个构造
  48.         f1(A(2));//匿名对象
  49.         cout << endl;
  50.         cout << "***********************************************" << endl;
  51.         // 传值返回
  52.         // 返回时⼀个表达式中,连续拷⻉构造+拷⻉构造->优化⼀个拷⻉构造 (vs2019)
  53.         // ⼀些编译器会优化得更厉害,进⾏跨⾏合并优化,直接变为构造。(vs2022)
  54.         f2();//传值传参返回会产生临时变量,出了作用域会销毁
  55.         cout << endl;
  56.         // 返回时⼀个表达式中,连续拷⻉构造+拷⻉构造->优化⼀个拷⻉构造 (vs2019)
  57.         // ⼀些编译器会优化得更厉害,进⾏跨⾏合并优化,直接变为构造。(vs2022)
  58.         A aa2 = f2();
  59.         cout << endl;
  60.         // ⼀个表达式中,连续拷⻉构造+赋值重载->⽆法优化
  61.         aa1 = f2();
  62.         cout << endl;
  63.         return 0;
  64. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表