c++性能优化

1.继承:抽象设计是有损失的,在继承体系中子类的创建会调用父类的构造函数,销毁时会调用父类的析构函数,这种消耗会随着继承的深度直线上升, 不要过度的抽象和继承,更为严重的是多重继承中并且有虚函数的存在情况更为复杂,的确,这些问题设计开销,但是,多种继承减少了编码的负担,同时也让问题的解决方案更加简洁,这当然要付出一些代价。总之,与n个基类的多重继承层次相关的额外虚函数表有n-1个。派生类和最左边的非虚基类共享一个虚函数表。因此,带有2个基类的多种继承层次,有1个(2-1)基类的虚函数表和1个派生类的虚函数表,总共有2个虚函数表,如果有虚继承的存在,会进一步增长这个过程,是有额外的开销的。

2.对象的复合:对象的复合和继承很相似, 当一个对象包含其他对象构造时也会引起额外的构造。比如,类A中包含了类B非指针和引用对象,那么在构造对象a的时候会自动调用b的无参构造函数,即使还没有使用b,用指针代替就没有这种消耗,另外如果你的一个对象中用到数组和字符串, 是选择string,vector还是char * 和c系的数组,如果没有用到c++ stl库提供的相关的高级用法,建议选择后者。

3.构造函数:尽量用参数列表初始化代替参数,避免值传递初始化。

4.变量延时定义:在函数第一行先把所有用到的变量都定义好,但是c是没有运行时的消耗的,对于c++是不一样的,对于c++对象的构造和销毁时有消耗的,如果有大量的对象只在某个if条件的一个分支中出现,那就会有50%的消耗是可以避免的,对于这点在一个类中也是一样的,如果成员中只有成员只在某个时刻能用,就用指针代替,在构造对象时,初始化空指针,避免构造时调用它的构造函数。

5.虚函数:虚函数的底层实现是通过一个虚函数表来实现的,因此有虚函数的类构造时必须先初始化虚函数表,函数调用时也必须先找虚函数表,然后通过指针偏移找到相应的函数。有时候可以利用模板设计来代替虚函数继承,把运行时间的消耗提前到编译期。

6.返回值优化:虽然c++编译器会选择性的进行rvo优化但是不是强制的,当函数有多个返回语句并且返回不同名称的对象,函数过于复杂,返回对象没有定义拷贝构造函数时,rvo优化是不会执行的,所以当函数返回一个很大的对象时,尽量避免值传递。

7.变量的定义:在定义变量时尽量避免类型的不匹配造成临时变量的产生。

8.内存管理:c++内存管理的大权由我们自己掌握,对于项目中要频繁申请和释放的对象建议用简单的内存池来管理,可以大大的降低频繁申请和释放内存带来的消耗。

9.善用内联:内联函数不仅仅时简单的函数调用似的优化,他还有一个最大的优点,可以让编译器进行边界代码的运行环境优化,内联把代码拷贝到执行环境处避免了函数调用带来的消耗,并且编译器可以进行正常的编译优化,而函数调用是不能实现的。

10.stl:记住一点stl不是唯一的选择,合理选择stl善用stl算法。

11.缓存:对于多次使用的计算结果及时缓存,避免重复计算。

12.延时计算:对于不关心计算结果的计算过程尽量延时执行或者异步去执行。

13.多线程:尽可能的使用无锁式多线程开发,锁是一个非常消耗性能的东西,保证数据同步的手段有很多,volatile,原子操作都可以实现,尽量通过一些技巧使用这些手段避免锁的使用,如果迫不得已要使用锁,尽量减少锁的消耗,比如降低锁的粒度,使用性能更高的锁等等。

14.std::move操作:当不得不进行深拷贝时,如果深拷贝数据源在拷贝后就不在使用,尽可能的用move操作代替,或者在参数传递时用move操作代替临时的实参变量

15.cpu缓存:合理的利用cpu cache可以极大的提高代码的运行效率(例如:数组中以每列遍历和每行遍历的效率的不同),当然多线程环境下也要考虑cpu cache带来的影响

16内存对齐:在进行网络编程时,最好对网络中传送的数据块进行内存补齐,通常是8字节对齐,提高cpu访问内存效率,进而提高数据读写速度。

17.函数参数:用const引用代替值传递,如果函数参数过多,可以用对象来打包参数,减少参数过多带来的性能消耗。

18算法:尽可能优化你的算法

19.智能指针:必须用,可以大大降低程序的crash频率,但是智能指针和普通指针相比是有着额外消耗的。

20.内存池:对于需要频繁申请和释放的内存对象,如果可以重复利用对象的内存,建议通过内存池或者重载对象的new 操作符或者重载对象的placement new操作符来减少频繁的申请和释放内存,从而减少申请和释放内存的消耗和内存碎片的产生。

21.位运算代替乘除法,前缀运算符代替后缀运算。

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