C嘎嘎~~[谈谈C++的一些优化]

C++的一些优化

  • 匿名对象
  • 引用
    • 引用作形参
    • 引用作返回值
  • 编译器优化
    • 构造 + 拷贝构造 ⇒ 构造
    • 拷贝构造 + 拷贝构造 ⇒ 一个拷贝构造

匿名对象

通过以前C语言的学习, 我们知道了有一种 具有临时性的, 没有名字的变量 — — 匿名变量.
那么我们的对象应该也有这个特性 — — 匿名对象

匿名对象, 即没有名字的对象, 生命周期就在当行

匿名对象的一般表现方式

// 有默认构造函数
A()

// 有参构造
A(10,20)

️证明一下, 匿名对象的生命周期就在当行??


  • C嘎嘎~~[谈谈C++的一些优化]_第1张图片
    根据上面的结果显示, 匿名对象调用构造函数后, 下一行就会调用析构函数 — — 匿名对象的生命周期就是在当前行.

️ 老陈, 匿名对象的生命周期这么短, 能有什么用处?

  • 可以不用对象调用成员函数
    C嘎嘎~~[谈谈C++的一些优化]_第2张图片

️老陈, 我用下面的例子怎么不行?
C嘎嘎~~[谈谈C++的一些优化]_第3张图片

  • 所有的临时对象都具有常性, 故匿名对象也是具有常性的
    ⇒ 这里应该用常引用, const &
    C嘎嘎~~[谈谈C++的一些优化]_第4张图片
    ️ 不是匿名对象具有常性, 离开这一行就会销毁吗⇒ 那这个tem引用就不是野引用吗??
  • 针对这种情况, 我们的祖师爷就把这种用const引用修饰的匿名对象延长了生命周期, 把它的生命周期延长至当前函数局部域⇒ 所以上面的tem引用就不是野引用

在以后我们会学习一种字符串类 string
看看下面的三种操作, 你会使用哪一种操作

#include
#include

using namespace std;

void push_back(const string& tem)
{
	cout << "push_back(const string& tem)" << endl;
}

int main()
{
	
	string str1 = "666666";
	push_back(str1); // 通过对象调用

	push_back(string("666666"")); // 匿名对象
	push_back("666666"); // 隐式类型转换
}

第一种 — — 创建一个string对象, 传参使用此string对象
第二种 — — 传参用匿名对象
第三种 — — 运用隐式类型转换
其实, 第二种 和 第三种的本质是一样的:

  1. 形参肯定是 string对象, 不过构造出来的临时对象都具有常性
  2. 实参那边要用 常引用const &来接收 — — 这样是权限的平移; 如果是引用& 来接收, 那么就会是权限的放大

⇒ 所以, 我们以后尽量使用类似 第三种的方式, 这样不仅可以简单明了, 也可以省去很多步骤

引用

前面, 我们已经知道了 引用作参数 和 引用做返回值可以减少临时拷贝⇒ 从而达到节省空间, 提高效率的作用

引用作形参

首先, 先看一下对立面
C嘎嘎~~[谈谈C++的一些优化]_第5张图片
接下来, 看看引用作形参
C嘎嘎~~[谈谈C++的一些优化]_第6张图片
我们发现, 引用作形参减少了一次拷贝构造 和 析构

引用作返回值

先看一下传值返回(引用作形参)
C嘎嘎~~[谈谈C++的一些优化]_第7张图片
看一下传引用返回(引用作形参 ⇒ 这种情况就是 引用返回 && 引用作形参)
C嘎嘎~~[谈谈C++的一些优化]_第8张图片
传值作形参 && 传值返回
C嘎嘎~~[谈谈C++的一些优化]_第9张图片

编译器优化

编译器会对同一行中的相同功能的事情做一下优化

构造 + 拷贝构造 ⇒ 构造

为了测试 拷贝构造 ⇒ 这里我们就不让引用作形参
C嘎嘎~~[谈谈C++的一些优化]_第10张图片
当然, 还有一种 构造 + 拷贝构造 ⇒ 优化为构造 的情形 匿名对象返回
C嘎嘎~~[谈谈C++的一些优化]_第11张图片

拷贝构造 + 拷贝构造 ⇒ 一个拷贝构造

C嘎嘎~~[谈谈C++的一些优化]_第12张图片

  • 总结:
    匿名对象爽瓜瓜
    尽量使用引用作形参 和 引用作返回值
    如果不能用引用作返回值, 就尽量用编译器的优化⇒ 即尽量写在一行

用手挡住射进眼里的阳光,就像挡住对你的思念,挡不住.

你可能感兴趣的:(c++,c语言,开发语言)