簡體   English   中英

#pragma optimize的代碼有多便攜?

[英]How portable is code with #pragma optimize?

使用#pragma optimize代碼有多便攜? 大多數編譯器是否支持它以及對此#pragma的支持有多完整?

#pragma是編譯器添加非認可和非可移植語言擴展*認可且可移植的方式。

基本上,你永遠不會確定,並且至少有一個主要的C ++編譯器(g ++)不支持這個pragma。


*

從C ++標准(N3242):

16.6 Pragma指令[cpp.pragma]

表單的預處理指令

# pragma pp-tokens opt new-line

導致實現以實現定義的方式運行。 該行為可能導致轉換失敗或導致轉換程序或生成的程序以不符合的方式運行。 將忽略實現無法識別的任何編譯指示。

根據C標准(委員會草案 - 2011年4月12日):

6.10.6 Pragma指令

語義

表單的預處理指令

# pragma pp-tokens opt new-line

其中預處理令牌STDC沒有立即跟隨pragma中的pragma (在任何宏替換之前) 174)導致實現以實現定義的方式運行。 該行為可能導致轉換失敗或導致轉換程序或生成的程序以不符合的方式運行。 任何未被實現識別的pragma都將被忽略。

這是一個例子:

int main () {
    #pragma omp parallel for
    for (int i=0; i<16; ++i) {}
}

C和C ++ OpenMP API的很大一部分是作為#pragma s實現的。

通常,依靠編譯器標志不是一個好主意,因為每個編譯器都有自己的行為。

不應使用此標志,因為它是您注入代碼的編譯級別規范。

通常和理論上,如果不使用,編譯器應該忽略該標志。

#pragma關鍵字是可移植的,因為它應該始終在編譯器上編譯。 但是,pragma是特定於編譯器的,因此在更改編譯器時可能會抱怨一些警告。 一些pragma被廣泛使用,例如OpenMP中的這些。 為了使代碼盡可能地便於使用,您可以使用依賴於您正在使用的編譯器的#ifdef / #endif來包圍您的編譯指示。 例如:

#ifdef __ICC
   #pragma optimize
#endif

編譯器通常定義一些宏,例如__ICC ,使代碼知道正在使用哪個編譯器。

#pragma不可移植,完全停止。 曾經有一個版本的gcc用來開始游戲

在我們工作中使用的編譯器中,有兩個肯定不支持#pragma optimise ,而我無法回答其他編譯器。

即使他們這樣做,因為用於優化的命令行開關是不同的,pragma的選項可能會有所不同。

#pragma任何使用都是特定於編譯器的。

例如 :GNU,Intel和IBM:

#warning "Do not use ABC, which is deprecated. Use XYZ instead."

微軟:

#pragma message("Do not use ABC, which is deprecated. Use XYZ instead.")

關於#pragma optimize的具體問題, gccmicrosoft支持它,但並不意味着它將來會出現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM