background image

C++代码优化方法总结

优化是一个非常大的主题,本文并不是去深入探讨性能分析理论,算法的效率,况且我
也没有这个能力。我只是想把一些可以简单的应用到你的 C++代码中的优化技术总结在
这里,这样,当你遇到几种不同的编程策略的时候,就可以对每种策略的性能进行一个
大概的估计。这也是本文的目的之所在。
一. 优化之前
在进行优化之前,我们首先应该做的是发现我们代码的瓶颈( bottleneck)在哪里。然
而当你做这件事情的时候切忌从一个 debug-version 进行推断,因为 debug-version
中包含了许多额外的代码。一个 debug-version 可执行体要比 release-version 大出
40%。那些额外的代码都是用来支持调试的,比如说符号的查找。大多数实现都为
debug-version 和 release-version 提供了不同的 operator new 以及库函数。而且,一
个 release-version 的执行体可能已经通过多种途径进行了优化,包括不必要的临时对
象的消除,循环展开,把对象移入寄存器,内联等等。

 

另外,我们要把调试和优化区分开来,它们是在完成不同的任务。 debug-version 是用
来追捕 bugs 以及检查程序是否有逻辑上的问题。release-version 则是用来做一些性能
上的调整以及进行优化。
下面就让我们来看看有哪些代码优化技术吧:
二. 声明的放置
程序中变量和对象的声明放在什么位置将会对性能产生显著影响。同样,对 postfix 和
prefix 运算符的选择也会影响性能。这一部分我们集中讨论四个问题:初始化 v.s 赋值,
在程序确实要使用的地方放置声明,构造函数的初始化列表,prefix v.s postfix 运算符。

(1  

) 请使用初始化而不是赋值

在 C 语言中只允许在一个函数体的开头进行变量的声明,然而在 C++中声明可以出现在
程序的任何位置。这样做的目的是希望把对象的声明拖延到确实要使用它的时候再进行。
这样做可以有两个好处:1. 确保了对象在它被使用前不会被程序的其他部分恶意修改。
如果对象在开头就被声明然而却在 20 行以后才被使用的话,就不能做这样的保证。2. 使
我们有机会通过用初始化取代赋值来达到性能的提升,从前声明只能放在开头,然而往
往开始的时候我们还没有获得我们想要的值,因此初始化所带来的好处就无法被应用。但
是现在我们可以在我们获得了想要的值的时候直接进行初始化,从而省去了一步。注意,
或许对于基本类型来说,初始化和赋值之间可能不会有什么差异,但是对于用户定义的
类型来说,二者就会带来显著的不同,因为赋值会多进行一次函数调用----operator =。
因此当我们在赋值和初始化之间进行选择的话,初始化应该是我们的首选。
(2  

) 把声明放在合适的位置上

在一些场合,通过移动声明到合适的位置所带来的性能提升应该引起我们足够的重视。例
如:
bool is_C_Needed(); 
void use()
{
C c1; 
if (is_C_Needed() == false) 

return; //c1 was not needed