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

问题描述:

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

表示在编译这个函数时,临时关闭所有编译优化选项,在这个函数后则恢复编译优化选项。


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值