C++ | 【04 效率】More Effective C++

C++ | 【04 效率】More Effective C++,第1张

文章目录
  • 索引
    • 18、考虑使用lazy evalution
        • 18.1 引用计数
        • 18.2 区别对待读取和写入
        • 18.3 Lazy Ferching
    • 19、分期摊还期望的计算
    • 20、理解临时对象的来源
    • 21、协助完成返回值优化
    • 22、通过重载避免隐式类型转换
    • 23、考虑用运算符的赋值形式取代单独形式
    • 24、考虑变更程序库
    • 25、理解虚拟函数、多继承、虚基类、RTTI所需的代价

索引

C++ | 【01 基础提议】More Effective C++🧡💛💚💙
C++ | 【02 运算符】More Effective C++🧡💛💚💙
C++ | 【03 异常】More Effective C++🧡💛💚💙
C++ | 【04 效率】More Effective C++🧡💛💚💙
C++ | 【05 技巧】More Effective C++🧡💛💚💙
C++ | 【06 杂项】More Effective C++🧡💛💚💙

18、考虑使用lazy evalution
- 推迟计算到需要该结果;
- 节省编译器做的事;
18.1 引用计数
除非你确实需要,否则不去为任何东西制造拷贝;
String s1 = "hello";
String s2 = s1;

一般 *** 作是通过拷贝构造,将s1拷贝到s2中;而考虑到lazy evalution则将s1共享给s2,避免了另一个对象的生成,节省了不必要的开销;

18.2 区别对待读取和写入
string s("Hello");
int x = s[3];	// 读 *** 作\
s[3] = 'x';		// 写 *** 作
18.3 Lazy Ferching
当对象建立时,不从磁盘中读取所有数据,当需要某数据时,才进行提取;
19、分期摊还期望的计算
例如:计算min、max、avg时,在计算的过程中不断跟踪当前集合的值,最后即可直接得出;

- 即通过缓存的方法计算出,后面可能需要的值;

例如在数据库中查询字段,可以用来缓存查找到的数据,故下次查询前可先在缓存中查找;

- 大型对象意味着不适合虚拟内存或cache页,会降低性能,切分页 *** 作会增加;
20、理解临时对象的来源
- 通过传值方式传递对象或传递常量引用或发生类型转换;
- 当传递一个非常量引用就不会发生;
- 临时对象是有开销的,需要尽可能去除;
	- 见到常量引用`reference to const`就应该想到可能产生临时对象;
	- 见到函数返回对象就可能会有临时对象被建立;
21、协助完成返回值优化
一个返回对象的函数效率一般较低,其返回值会到导致对象进行构造和析构;

C++ | 一文整理Effective C++ 55条款内容(全)第21条

22、通过重载避免隐式类型转换
class UPInt {
public:
    UPInt();
    UPInt(int val);
};
const UPInt operator+(const UPInt& lhs, const UPInt& rhs);
const UPInt operator+(int lhs, const UPInt& rhs);
const UPInt operator+(const UPInt& lhs, int rhs);
// error
const UPInt operator+(int lhs, int rhs);
上述代码中,不能重载最后一种,必须带有一个用户定义类型的参数;
消除了隐式转换的需要,减少了需要建立临时对象的开销;
23、考虑用运算符的赋值形式取代单独形式
- 赋值形式(+=)比单独形式(+)效率高,由于单独形式需要返回一个新对象;
- 提供赋值形式也要提供标准形式
class Rational{
public:
    Rational& operator+=(const Rational& rhs){
        *this += rhs;
        return *this;
    }

    Rational& operator-=(const Rational& rhs){
        *this -= rhs;
        return *this;
    }
};
template<class T>
const T operator+(const T& lhs, const T& rhs){
    return T(lhs) += rhs;
}
template<class T>
const T operator-(const T& lhs, const T& rhs) {
    return T(lhs) -= rhs;
}
# 该方法可以使用返回值优化,匿名对象比命名对象更好一些;
return T(lhs) -= rhs;
24、考虑变更程序库

25、理解虚拟函数、多继承、虚基类、RTTI所需的代价

C++【对象模型】| 虚函数表 & 多态如何调用虚函数

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/673451.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存