程序设计性能优化整理(二)

来源:互联网 发布:最好的交友软件 编辑:程序博客网 时间:2024/05/20 18:04
1.函数返回值的优化 
不能不返回(非类内部成员),不能返回指针(无论是从函数参数还是返回值),也不能返回引用的函数(临时对象的引用会丢掉,除非是类本身)。
那么只能返回对象,返回对象也是可以优化的,首先减少类内局部对象的构造,第二返回匿名对象编译器可以帮助优化不生成临时对象。
Number operator +(const Number &num1, const Number &num2)
{
  return Number(num1.m1 + num2.m1);
}

2.运算符重载减少类型转换
类型转换是比较浪费时候,和产生构造的。可以通过对指定类重载运算符来避免隐性的类型转换产生的构造临时对象。
可以通过类内,对左边的类型进行运算,返回类自己的引用的运算符重载可以实现。
但是只有有需要的时候才使用运算符重载,不要过度的运算符重载,否则会导致类型转换的混乱,所以运算符重载需要谨慎。
库的编写需要更全面点的运算符重载,应用层只要高效常用的重载就可以了。

3.运算符重载用operator +=方式可以返回左边对象的引用,减少临时对象开销
operator +需要调用operator +=,这样让调用统一,维护修改方便,operator +方式还是需要返回一个对象,那么返回匿名对象可以让编译器
对返回值优化,从而有更好的性能。

4.更换库,实现更高的性能
不同的库会基于不同的考虑,stdio库性能更高使用起来没有那么容易,不方便扩展,当时性能比iostream高20%左右。
iostream使用比较简单,便于扩展。

5.非for/switch递归小函数多用内联,减少虚函数使用(vtbl/vptr),多继承使用虚基类,RTTI(VC中一般禁用,使用它不如自己加入枚举类型来判断)
包含或者继承中有虚函数,那么该类会生成一个vtbl,vptr。vtbl是一个指针数组,里面记录了最近的虚函数指针。一些编译器会为每个Obj文件
生成一个vtbl表,当连接时候才会把重复的vtbl去掉,大多数编译器会采用启发式算法,给第一个非内联且非纯虚的虚函数类生成vtbl,其它的
单继承或者多继承的类如果没有自己的虚函数,那么就不用生成vtbl了,如果有自己的虚函数那么就要生成自己的vtbl。
vtbl存在于类中,vptr存在于对象中。每个虚函数类都要有一个ptr指向本类型的vtbl。
菱形多继承中如果没有声明虚基类那么会生成多份相同数据成员的拷贝,包括vtbl,因此需要声明为虚基类,
声明为虚基类后数据成员会生成一个指向虚基类的指针。
RTTI是建立在vtbl之上的,有一个指向type_info的指针在vtbl上,RTTI开销就是这个指针和type_info对象本身的大小。
虚函数对生成文件大小有直接影响,但是运算速度就是指针偏移O(1)的性能开销。
不使用虚函数那么可以使用内联函数提高效率,减少虚函数的使用减少类大小,和使用虚基类优化内存,RTTI有必要时候就使用。

参考资料:
<<More Effective C++>>



0 0
原创粉丝点击