1. 程式人生 > >一種 VC release 編譯極慢的原因和解決辦法

一種 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

表示在編譯這個函式時,臨時關閉所有編譯優化選項,在這個函式後則恢復編譯優化選項。