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

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

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

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

相关文章
|
2月前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
53 2
|
7月前
|
存储 算法 编译器
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用(一)
【C++ 引用 】C++深度解析:引用成员变量的初始化及其在模板编程中的应用
907 0
|
7月前
|
存储 安全 Java
Python中的引用和赋值机制允许变量引用内存中的对象,并通过引用计数来管理对象的生命周期
【5月更文挑战第14天】Python中的变量是对象引用,不存储数据,而是在内存中创建对象。赋值操作创建新变量并使其指向已有对象。引用计数用于管理对象生命周期,引用数为0时对象被回收。理解这些机制对编写高效Python代码很重要。
66 6
|
7月前
函数参数传递_使用引用避免拷贝
函数参数传递_使用引用避免拷贝
33 0
|
7月前
|
开发框架 安全 编译器
【C/C++ 深入探讨构函数】C++ 编译器在什么情况下无法生成默认的析构函数?
【C/C++ 深入探讨构函数】C++ 编译器在什么情况下无法生成默认的析构函数?
165 1
|
编译器 C++ 容器
C++移动语义及拷贝优化
C++移动语义即提出了一个右值引用,使用`std::move`可以强制将左值引用转为右值引用。而对于右值引用,程序可以调用移动构造函数进行对象的构造,减少了原来调用拷贝构造函数的时候很大的开销。移动构造函数和移动赋值运算符的实现即是对象所有权的转让,让那些左值对象(临时对象)变成右值对象的过程。 编译器的拷贝优化确实效率很高,但是不能保证总是成功实施的。所以,好的编程习惯应该是对于自定义的类最好添加移动构造函数,重载移动赋值运算符。这样编译器的拷贝优化不成功的时候,可以调用移动构造减轻复制的开销,提高程序运行的效率。
88 0
|
程序员
拷贝函数的优化
拷贝函数的优化
63 0
|
程序员 编译器 数据安全/隐私保护
内存、引用、封装、函数
内存、引用、封装、函数
76 0
|
Java
有几种方式获取字节码文件对象?
有几种方式获取字节码文件对象?
119 0
|
编译器 C++
C/C++中的三种拷贝方式
C/C++中的三种拷贝方式
143 0