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

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

匿名对象

通过以前C语言的学习, 我们知道了有一种 具有临时性的, 没有名字的变量 — — 匿名变量.

那么我们的对象应该也有这个特性 — — 匿名对象


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


匿名对象的一般表现方式👇👇👇

// 有默认构造函数
A()
// 有参构造
A(10,20)

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


e62abfde2744400b8a350eec206ccecf.png


根据上面的结果显示, 匿名对象调用构造函数后, 下一行就会调用析构函数 — — 匿名对象的生命周期就是在当前行.

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


可以不用对象调用成员函数

a84446cc09e8450eb548175ff8f7ac18.png

🗨️老陈, 我用下面的例子怎么不行?

8eff3b1b35da4179b5db31719482ea0b.png


所有的临时对象都具有常性, 故匿名对象也是具有常性的

⇒ 这里应该用常引用, const &

ac1bc96d284a47168055baa9c085921e.png

🗨️ 不是匿名对象具有常性, 离开这一行就会销毁吗⇒ 那这个tem引用就不是野引用吗??

针对这种情况, 我们的祖师爷就把这种用const引用修饰的匿名对象延长了生命周期, 把它的生命周期延长至当前函数局部域⇒ 所以上面的tem引用就不是野引用

在以后我们会学习一种字符串类 string

看看下面的三种操作, 你会使用哪一种操作👇👇👇


#include<iostream>
#include<string>
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 &来接收 — — 这样是权限的平移; 如果是引用& 来接收, 那么就会是权限的放大

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


引用

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


引用作形参

首先, 先看一下对立面

abc1d04f94bc4a109b432197e442a8e7.png

接下来, 看看引用作形参

037ca5c3817d4d4ea2f478e598d01af5.png

我们发现, 引用作形参减少了一次拷贝构造 和 析构


引用作返回值

先看一下传值返回(引用作形参)

3d7330b0f07e4da6a1a6da752fb5363e.png

看一下传引用返回(引用作形参 ⇒ 这种情况就是 引用返回 && 引用作形参)

41cd918f74ed4cffa5efcc39d2ceca4b.png

传值作形参 && 传值返回

b5a9df9e809540bc83c162e1e8a72d07.png


编译器优化

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


构造 + 拷贝构造 ⇒ 构造

为了测试 拷贝构造 ⇒ 这里我们就不让引用作形参

773e3f21a62844ae9d30f0ac92bf4dfe.png

当然, 还有一种 构造 + 拷贝构造 ⇒ 优化为构造 的情形 匿名对象返回

67bc0fc6acb34604ab34416a5f535b2e.png


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

1cccbf4aa678484d99688c8cbb146379.png


总结:

匿名对象爽瓜瓜

尽量使用引用作形参 和 引用作返回值

如果不能用引用作返回值, 就尽量用编译器的优化⇒ 即尽量写在一行



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


相关文章
|
7月前
|
存储 缓存 算法
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
【C/C++ 性能优化】提高C++程序的缓存命中率以优化性能
1122 0
|
7月前
|
存储 算法 编译器
C/C++编译器局部优化技术:局部优化是针对单个函数或基本块进行的优化
C/C++编译器局部优化技术:局部优化是针对单个函数或基本块进行的优化
228 0
|
2月前
|
安全 编译器 程序员
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
【C++篇】C++类与对象深度解析(六):全面剖析拷贝省略、RVO、NRVO优化策略
57 2
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化2
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
77 6
|
2月前
|
安全 测试技术 C++
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化1
【C++篇】从零实现 C++ Vector:深度剖析 STL 的核心机制与优化
91 7
|
7月前
|
存储 缓存 算法
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
高效编程:我们应该了解哪些编译器优化技术?如何做出成熟的优化行为,掌握C++编程中的编译器优化艺术。
448 5
|
6月前
|
编译器 C++ 开发者
C++一分钟之-返回值优化与Move Semantics
【6月更文挑战第19天】C++的RVO与移动语义提升效率,减少对象复制。RVO是编译器优化,避免临时对象的创建。移动语义通过右值引用和`std::move`转移资源所有权。注意RVO不是总有效,不应过度依赖。使用移动语义时,避免误用`std::move`导致对象无效。示例展示了RVO和移动构造函数的应用。理解并恰当使用这些机制能写出更高效代码。
72 3
|
7月前
|
消息中间件 算法 Java
C++实时通信优化技术探究
C++实时通信优化技术探究
80 3
|
7月前
|
算法 测试技术 数据处理
【C++ 设计思路】优化C++项目:高效解耦库接口的实战指南
【C++ 设计思路】优化C++项目:高效解耦库接口的实战指南
199 5
|
7月前
|
存储 算法 数据管理
C++中利用随机策略优化二叉树操作效率的实现方法
C++中利用随机策略优化二叉树操作效率的实现方法
122 1