编译器优化选项
所有C++编译器有各种你可以打开、关闭的优化选项。了解正在使用编译器可用的选项,并打开所有相关选项,是重要的。
许多优化选项与调试不兼容。调试器可以一次执行一行代码,并显示所有变量的值。显然,在部分代码被重排、内联或优化掉时,这是不可能的。通常制作可执行程序的两个版本:带有完整调试支持,在程序开发期间使用的调试版本;以及打开所有相关优化选项的发布版本。大多数IDE(集成开发环境)有制作目标文件与可执行文件的调试版本与发布版本的设施。确保区分这两个版本,在可执行文件的优化版本里关闭调试与分析支持。
大多数编译器提供优化大小与优化速度的选择。优化大小:在代码是快速的且希望可执行文件尽可能小,或者代码缓存是关键的时。优化速度:在CPU使用与内存使用是关键时间消耗者时。最高的优化等级选项通常是最好的,除了一些特定的场景。
某些编译器提供分析指引(profile-guided)优化。这以下面的方式工作。首先,你使用分析支持编译程序。然后,你使用分析器进行一次测试运行,确定程序流以及每个函数与分支执行的次数。然后,编译器可以使用这个信息优化代码,以最优的次序放置不同的函数。
某些编译器支持全程序优化。这通过两步编译进行。首先,所有的源文件被编译为一个中间文件格式,而不是普通的目标文件格式。然后第二步,中间文件被链接起来。寄存器分配与函数内联在第二步完成。中间文件格式不是标准化。甚至在同一个编译器的不同版本间也不兼容。因此,以这个格式发布函数是不可能的。
其他编译器提供了将多个.cpp文件编译为单个目标文件的可能性。进行全程序优化一个更原始、但高效的方式是,通过#include
指示把所有的源文件合并为一个,并把所有函数声明为static
或inline
。这将使编译器能进行全程序的过程间优化。
在不需要与旧CPU兼容时,你可以选择较新的指令集。甚至更好,你可以制作代码关键部分的多个版本以支持不同的CPU。
在没有异常处理时,代码变得更高效。建议关闭异常处理的支持,除非代码依赖结构化的异常处理,且你希望代码能够从异常恢复。
建议关闭。。。
优化指令
某些编译器有许多关键字与指令用于在代码特定位置给出特定的优化指令。许多这些指示是与编译器相关的。你不能预期用于Windows编译器的指令能在Linux编译器上工作,反之亦然。但大多数Microsoft指令在用于Windows的Intel编译器与Gnu编译器上起作用,而大多数Gnu指令在用于Linux的PathScale与Intel编译器上起作用。
在所有C++编译器上起作用的关键字
关键字volatile
确保一个变量不会被保存在寄存器里,即使临时。这目的在于在多个线程间共享变量,但它也可以用于关闭用于测试目的变量的所有优化。
。。。
关键字static
,在应用到类成员函数时,表示它不能访问任何非静态数据成员或成员函数。静态成员函数的调用比非静态成员函数快,因为它不需要this
指针。建议只要合适,将成员函数声明为static
。
编译器特定关键字
快速函数调用。__fastcall
或者__attribute__((fastcall))
。在32位模式中,fastcall修饰符会使32-bit模式函数调用更快。前两个整形参数在寄存器中传递而不是栈。Fastcall函数在编译器间不兼容。在参数在寄存器中传递的64位模式中,不需要fastcall。
纯函数。__attribute__((const))
(仅Linux)。声明一个函数为纯函数。这允许公共子表达式消除与循环不变代码移动。
。。。
欢迎交流