C++代码优化方法总结(四)(1)
C++代码优化方法总结(四) cppbug cpp_bug@hotmail.com
五. 速度优化在一些对速度要求非常苛刻的应用系统中,每一个CPU周期都是要争取的。这个部分展现了一些简单方法来进行速度优化。1. 使用类来包裹长的参数列表一个函数调用的负担将会随着参数列表的增长而增加。运行时系统不得不建立堆栈来存储参数值;通常,当参数很多的时候,这样一个操作就会花费很长的时间。把参数列表包裹进一个单独的类中并且通过引用进行传递,这样将会节省很多的时间。当然,如果函数本身就很长,那么建立堆栈的时间就可以忽略了,因此也就没有必要这样做。然而,对于那些执行时间很短而且经常被调用的函数来说,包裹一个长的参数列表在对象中并且通过引用传递将会提高性能。2. 寄存器变量register specifier被用来告诉编译器一个对象将被会非常多的使用,可以把它放入寄存器中。例如:void f(){ int *p = new int[3000000]; register int *p2 = p; //store the address in a register for (register int j = 0; j<3000000; j++) { *p2++ = 0; } //...use p delete [] p;}循环计数是应用寄存器变量的最好的候选者。当它们没有被存入一个寄存器中,大部分的循环时间都被用在了从内存中取出变量和给变量赋新值上。如果把它存入一个寄存器中的话,将会大大减少这种负担。需要注意的是,register specifier仅仅是对编译器的一个建议。就好比内联函数一样,编译器可以拒绝把一个对象存储到寄存器中。另外,现代的编译器都会通过把变量放入寄存器中来优化循环计数。Register storage specifier并不仅仅局限在基本类型上,它能够被应用于任何类型的对象。如果对象太大而不能装进寄存器的话,编译器仍然能够把它放入一个高速存储器中,例如cache。用register storage specifier声明函数型参将会是建议编译器把实参存入寄存器中而不是堆栈中。例如:
void f(register int j, register Date d);
3. 把那些保持不变的对象声明为const通过把对象声明为const,编译器就可以利用这个声明把这样一个对象放入寄存器中。4. Virtual function的运行期负担