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

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

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

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;
}

相关文章
|
1月前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
45 2
|
1月前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(二)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
|
1月前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(三)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
|
1月前
|
存储 编译器 C++
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作(一)
【C++】掌握C++类的六个默认成员函数:实现高效内存管理与对象操作
|
6月前
|
设计模式 算法 数据安全/隐私保护
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
119 0
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(二)
|
6月前
|
存储 算法 编译器
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(一)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
786 0
|
6月前
|
存储 安全 Java
Python中的引用和赋值机制允许变量引用内存中的对象,并通过引用计数来管理对象的生命周期
【5月更文挑战第14天】Python中的变量是对象引用,不存储数据,而是在内存中创建对象。赋值操作创建新变量并使其指向已有对象。引用计数用于管理对象生命周期,引用数为0时对象被回收。理解这些机制对编写高效Python代码很重要。
61 6
|
6月前
|
安全 编译器 C++
C++类与对象【对象的初始化和清理】
C++类与对象【对象的初始化和清理】
C++类与对象【对象的初始化和清理】
|
6月前
函数参数传递_使用引用避免拷贝
函数参数传递_使用引用避免拷贝
28 0
|
6月前
|
开发框架 安全 编译器
【C/C++ 深入探讨构函数】C++ 编译器在什么情况下无法生成默认的析构函数?
【C/C++ 深入探讨构函数】C++ 编译器在什么情况下无法生成默认的析构函数?
144 1