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

本文探讨了C++中的懒加载技术、引用计数减少内存消耗、区别对待读写操作、懒加载数据结构的应用,以及如何通过返回值优化、重载和运算符赋值提升性能。此外,还包括了理解临时对象、虚拟函数成本和选择合适库的建议。
摘要由CSDN通过智能技术生成

索引

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++【对象模型】| 虚函数表 & 多态如何调用虚函数

作者 : Scott Meyers 译序、导读 : 侯捷 译序(侯捷) C++ 是一个难学易用的语言! C++ 的难学,不仅在其广博的语,以及语背後的语意,以及语意背後的深层思维,以及深层思维背後的物件模型;C++ 的难学,还在於它提供了四种不同(但相辅相成)的程式设计思维模式:procedural-based,object-based,object-oriented,generic paradigm。 世上没有白吃的午餐。又要有效率,又要有弹性,又要前瞻望远,又要回溯相容,又要能治大国,又要能烹小鲜,学习起来当然就不可能太简单。 在如此庞大复杂的机制下,万千使用者前仆後续的动力是:一旦学成,妙用无穷。C++ 相关书籍之多,车载斗量;如天上繁星,如过江之鲫。广博如四库全书者有之(The C++ Programming Language、C++ Primer),深奥如重山复水者有之(The Annotated C++ Reference Manual, Inside the C++ Object Model),细说历史者有之(The Design and Evolution of C++, Ruminations on C++),独沽一味者有之(Polymorphism in C++, Genericity in C++),独树一帜者有之(Design Patterns,Large Scale C++ Software Design, C++ FAQs),程式库大全有之(The C++ Standard Library),另辟蹊径者有之(Generic Programming and the STL),工程经验之累积亦有之(Effective C++, More Effective C++, Exceptional C++)。 这其中,「工程经验之累积」对已具C++ 相当基础的程式员而言,有著致命的吸引力与立竿见影的帮助。Scott Meyers 的Effective C++ 和More Effective C++ 是此类佼佼,Herb Sutter 的Exceptional C++ 则是後起之秀。 这类书籍的一个共通特色是轻薄短小,并且高密度地纳入作者浸淫於C++/OOP 领域多年而广泛的经验。它们不但开展读者的视野,也为读者提供各种C++/OOP 常见问题或易犯错误的解决模型。某些小范围主题诸如「在base classes 中使用virtual destructor」、「令operator= 传回*this 的reference」,可能在百科型C++ 语言书籍中亦曾概略提过,但此类书籍以深度探索的方式,让我们了解问题背後的成因、最佳的解、以及其他可能的牵扯。至於大范围主题,例如smart pointers, reference counting, proxy classes,double dispatching, 基本上已属design patterns 的层级! 这些都是经验的累积和心血的结晶。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值