2011-01-21 17 views
9

我想在不調用預處理器的情況下運行Microsoft Visual Studio Compiler cl.exe。這可能嗎?我認爲僅僅編譯預處理源代碼(使用/c標誌)會使預處理器運行成爲無操作,但顯然情況並非如此。我做了一些基準測試。這裏有一個小的源文件(main.cpp),它只是包含了一些代碼:如何在兩個單獨的步驟中運行MSVC預處理器和編譯器?

#include <iostream> 
#include <string> 
#include <windows.h> 

這裏有一些不同的編譯器調用和他們的時機:

 
1: cl /c main.cpp        ~1.02s 
2: cl /EP main.cpp > main-preprocessed.cpp ~0.5s 
3: cl /c main-preprocessed.cpp    ~0.75s 

看來,編譯預處理的源代碼已經是快一點(預處理器不需要做任何事情)。但是,1和2之間的差異表明實際的編譯器和彙編器只需要0.5s多一點。因此編譯預處理的源代碼(如第3步所做)比我希望的要慢一些。

有什麼辦法可以運行編譯器和彙編器,而不需要調用預處理器?我對MSVC6到MSVC10的解決方案感興趣。

+0

好奇心:爲什麼?你是否希望以某種方式加快編譯速度?可能值得嘗試編寫PCH的相同實驗,而不是預處理的C++源代碼。 – Rup 2011-01-21 10:16:16

+1

@Rup:我爲MSVC編寫了一個編譯器緩存(很像`ccache`),請參閱http://github.com/frerich/clcache-該程序使用預處理源代碼(除其他外)來確定編譯器/彙編程序需要重新運行,或者以前生成的目標文件是否可以重新使用。在緩存未命中的情況下,我不想重新運行預處理器,而是重新使用爲生成緩存而生成的源代碼。 – 2011-01-21 10:47:48

回答

3

據我所知是沒有辦法不預處理器(不管事實,即它不會做任何事情編譯運行。

然而,分離該2個階段顯然會慢的要添加寫然後回讀該文件,如果不需要執行這些寫操作,則可以將其保存在內存中,並節省大量時間等待磁盤寫入到&從中讀取。即使您可以禁用預處理器,它仍然會比同時運行兩個階段慢。

0

可能很多時候你認爲預處理器正在花費的時間實際上是花費在將大文件寫入磁盤上的時間。預處理器應該佔用編譯器其餘部分所花的時間的很小一部分。正常預編譯的一大優點是編譯器可以在預處理器階段仍在運行時開始編譯,可能在單獨的線程中或者它檢測到新的預處理器輸出。大型的預處理器輸出可能不需要佔用內存(更不用說磁盤了),因爲它被佔用更少的塊。

相關問題