问题描述:
本人使用的是 Visual C++ 2008 。一直使用正常。
最近发现项目在 release 时编译极慢,要6~10分钟不等,无法忍受。
在慢的时候,输出窗口显示“正在生成代码”。
原因分析:
调试了各种编译选项,均不奏效。
后来分析代码,发现问题出现在某个特定的 cpp.
这个 cpp 的独特之处在于有一个很大的字节数组的常量初始化。
例如
char a[ ] = { 0x11, 0x12, 0x15 };
在我的源码中,这句话的特别之处在于初始化的数据特别长,有26k。
为了让源码看起来方便,我把数据部分放到了一个独立的 txt 中,并用
include 引入到 cpp中。看起来是这样的。
在 data.txt 中
0x11, 0x10, 0x7F, 0x8A, .....
.......
0xAB, 0x3D
在 cpp 中
char a[] = {
#include "data.txt"
};
在 Debug 模式下,编译速度正常,但在 Release 模式下就很慢。
若将 #include "data.txt" 改成一个数,则 Release 模式下的编译速度恢复正常。
因此判断编译速度慢的原因可能是 Release 模式下,编译器尝试优化代码,而包含了 data.txt 的 cpp 代码极长,优化程序为分析代码而消耗大量时间。 Debug 模式之所以编译速度正常是因为 Debug 模式没有对代码进行优化。
解决方案:
鉴于以上分析,解决的办法就是关闭优化。但是,在整个项目关闭优化会降低程序的运行性能,若能仅在涉及到 data.txt 的部分临时关闭优化就好了。
经查, 预编译指令 #pragma optimiz( "") off 可以达此目的。
因此,最终的解决方案就是在包含 #include "data.txt" 的函数之前加上和之后分别加上 #pragma optimiz("") off 和 on.
代码如下:
#pragma ("") off
void f() {
char a[] = {
#include "data.txt"
};
....// something else.
}
#pragma ("") on
表示在编译这个函数时,临时关闭所有编译优化选项,在这个函数后则恢复编译优化选项。