拷贝对象时编译器的一些优化

简介: 拷贝对象时编译器的一些优化

在传参和传值返回的过程中,编译器会通过一些优化减少拷贝的次数。

class A
{
public:
  A(int x = 1)
    :_a(x)
  {
    cout << "A()" << endl;
  }

  A(const A& aa)
    :_a(aa._a)
  {
    cout << "A(const A& aa)" << endl;
  }

  A& operator=(const A& aa)
  {
    cout << "A& operator=(const A& aa)" << endl;
    if (this != &aa)
    {
      _a = aa._a;
    }
    return *this;
  }

  ~A()
  {
    cout << "~A()" << endl;
  }

private:
  int _a;
};

void f1(A aa)
{
}

A f2()
{
  A a1;
  return a1;
}

场景1:

int main()
{
    // 传值传参
  A a1;
  f1(a1);
  cout << endl;
  // 传值返回
  f2();
  cout << endl;
  return 0;
}

运行结果:

1. 隐式转换,连续构造+拷贝构造——>直接构造:
int main()
{
  f1(1);
  return 0;
}

2. 一个表达式中,连续构造+拷贝构造——>直接构造:
int main()
{
  f1(A(1));
  return 0;
}

2. 一个表达式中,连续构造+拷贝构造——>直接构造:
int main()
{
  f1(A(1));
  return 0;
}

3. 一个表达式中,拷贝构造+拷贝构造——>一个拷贝构造:
int main()
{
  A a2 = f2();
  return 0;
}

目录
打赏
0
1
1
0
1
分享
相关文章
|
10月前
函数参数传递_使用引用避免拷贝
函数参数传递_使用引用避免拷贝
49 0
【C++ 内联函数和库】了解函数导出至库的原理以及其中内联函数的处理
【C++ 内联函数和库】了解函数导出至库的原理以及其中内联函数的处理
248 0
|
10月前
|
c++拷贝对象时的优化问题
博主是基于VS2019测试的,不同编译器可能情况不一样。 看下面这一个类A:
62 0
C++移动语义及拷贝优化
C++移动语义即提出了一个右值引用,使用`std::move`可以强制将左值引用转为右值引用。而对于右值引用,程序可以调用移动构造函数进行对象的构造,减少了原来调用拷贝构造函数的时候很大的开销。移动构造函数和移动赋值运算符的实现即是对象所有权的转让,让那些左值对象(临时对象)变成右值对象的过程。 编译器的拷贝优化确实效率很高,但是不能保证总是成功实施的。所以,好的编程习惯应该是对于自定义的类最好添加移动构造函数,重载移动赋值运算符。这样编译器的拷贝优化不成功的时候,可以调用移动构造减轻复制的开销,提高程序运行的效率。
113 0
拷贝函数的优化
拷贝函数的优化
110 0
有几种方式获取字节码文件对象?
有几种方式获取字节码文件对象?
170 0
嵌入式linux基础:c++(四)重载 指针 引用
嵌入式linux基础:c++(四)重载 指针 引用
162 0
嵌入式linux基础:c++(四)重载 指针 引用
六个方法两个拷贝带你透彻对象合并问题
实际场景下,我们经常需要进行对象合并的操作,而有时候原对象的改变会改变合并后的对象,这是一个非常严重的问题,涉及到了合并对象中的深浅拷贝,递归遍历,让人发蒙。
207 1
【C++】C++核心编程部分-内存分区模型-引用-函数提高-类与对象-文件操作
【C++】C++核心编程部分-内存分区模型-引用-函数提高-类与对象-文件操作