c++拷贝对象时的优化问题

简介: 博主是基于VS2019测试的,不同编译器可能情况不一样。看下面这一个类A:

博主是基于VS2019测试的,不同编译器可能情况不一样。

看下面这一个类A:

class A
{
public:
  A(int a = 0)
    :_a(a)
  {
    cout << "A(int a = 0)" << endl;
  }
  A(const A& aa)
    :_a(aa._a)
  {
    cout << "~A(const A& aa)" << endl;
  }
  ~A()
  {
    cout << "~A()" << endl;
  }
  A& operator= (const A& aa)
  {
    cout<<" A& operatoor = (const A & aa)" <<endl;
    if (this != &aa)
    {
      _a = aa._a;
    }
    return *this;
  }
private:
  int _a;
};
void f1(A aa)
{}
A f2()
{
  A aa;
  return aa;
}

示例分析

只有传值传参

// 传值传参
A aa1;
f1(aa1);
cout << endl;    //一次构造,一次拷贝构造



1376bcaa95b24136a2fd4cac29866dfa.png

直接优化例子:

// 隐式类型,连续构造+拷贝构造->优化为直接构造
f1(1); 


ae543948616e4ff987b8c477d9adc12c.png

// 一个表达式中,连续构造+拷贝构造->优化为一个构造
f1(A(2));    
cout << endl;


1798736116ad4a2cb553ef1c11816ee6.png

传值返回

// 传值返回
f2();    //   1次 构造一次 + 1次 拷贝构造
cout << endl;


e27388935b1746c1aa321010e97abd23.png

按道理说是1次构造+2次拷贝构造,但是编译器在遇到这种连续的拷贝构造,会自动优化成1次拷贝构造。

  // 一个表达式中,连续拷贝构造->优化为一个拷贝构造
  A aa1 = f2();
  cout << endl;



04515557dd044e05b7eaf6c151306771.png


349888fbe884493694ab95713eea082f.png

// 一个表达式中,连续拷贝构造+赋值重载->无法优化
A aa1;
aa1 = f2();
cout << endl;


c1ff5e34f7ea44bb98d1b9d2fe3b6318.png

55f95e059d5849eca72f005aff820ed0.png

一道例题

void f1(A aa)
{}
A f2()
{
  A aa;
  return aa;
}
A f(A u)
{
  A v(u);
  A w = v;
  return w;
}
int main()
{
  A x;
  A y = f(f(x));
}

请问调用了几次构造和拷贝构造?

1次构造和7次拷贝构造


f5f95dcd28544703b7c31c587a219082.png

调用示例如图所示:


1a7d09a7e6bf43068e4189b2d0d78bb0.png 

目录
相关文章
|
3天前
|
编译器 C语言 C++
【c++】类和对象4
【c++】类和对象4
23 2
|
3天前
|
编译器 C++
【c++】类和对象3
【c++】类和对象3
9 1
|
3天前
|
编译器 C++
【c++】类和对象2
【c++】类和对象2
8 1
|
3天前
|
存储 编译器 C语言
【c++】类和对象1
【c++】类和对象1
16 1
|
6天前
|
Java C++ Python
【c++】理解类和对象
【c++】理解类和对象
【c++】理解类和对象
|
6天前
|
编译器 C++
【c++】内部类和匿名对象
【c++】内部类和匿名对象
|
6天前
|
存储 编译器 C语言
【c++】类对象模型
【c++】类对象模型
【c++】类对象模型
|
6天前
|
存储 C语言 C++
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
【c++】类和对象 - 类的访问限定符及封装/作用域和实例化
|
6天前
|
编译器 C语言 C++
【c++】类和对象 - 类的引入和定义
【c++】类和对象 - 类的引入和定义
【c++】类和对象 - 类的引入和定义
|
7天前
|
C++
C++模板与STL【函数对象】
C++模板与STL【函数对象】