您的位置:首页 > 其它

一种 VC release 编译极慢的原因和解决办法

2017-01-18 17:31 274 查看
问题描述:

本人使用的是 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

表示在编译这个函数时,临时关闭所有编译优化选项,在这个函数后则恢复编译优化选项。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  VC 编译速度