2

我正在尋找一種簡單的方法來將某些g ++(g ++ - 4.9是特定的)編譯選項本地化爲某些代碼行或至少有針對性的功能。我一般來說都很感興趣,但也有具體到-fast-math,-ffinite-math-only-fno-signed-zeros選項。在代碼中本地化g ++編譯選項

我推測可以使用make實用程序在* .cpp文件級別進行本地化,但我希望有一種方法可以通過#pragma或__attribute__或其他東西在代碼本身中啓用它。我想這樣做不僅是爲了儘量減少對外部文件的依賴(即不正確的makefile的風險),而且希望將某些FP行爲超定位到函數中的特定方程。如果在項目構建中未啓用期望的編譯器指令(例如makefile丟失或不適當修改),如果不能通過內聯指令對FP行爲進行本地化,我該怎麼辦才能至少觸發編譯時錯誤。

我認爲這種內聯優化可能是編譯器特定的,在這種情況下,g ++,但這是我願意採取的折中方案。

回答

6

存在。在gcc你可以使用function attributeoptimize

void f() __attribute__ ((optimize("fast-math"), optimize("finite-math-only"), optimize("no-signed-zeros"))); 
+0

感謝。我發現了一些教程/幫助討論用於優化級別(例如O0,O1,O2)的\ __屬性___,但從描述來看,它對我來說並不明顯,它也適用於其他選項,如快速數學等。 – codechimp

1

您可能可以通過功能屬性中的fpmath選項打開這些功能的某些部分,但是這對我來說並不清楚。鑑於此,我將專注於檢測:

-fast-math已打開-ffinite-math-only,因此您不必擔心這一點。爲-fast-math文檔說:

該選項使預處理宏FAST_MATH是 定義。

這意味着它可以通過

#ifndef __FAST_MATH__ 
#error "The -fast-math compiler option is required" 
#endif 

被檢測到,我還沒有找到一個編譯時間的方法來檢測的-fno-signed-zeros

2

我不確定你是正確使用「本地化」這個詞。 Localization是關係到軟件適應於不同的人類語言(法語,俄語,中國...)

的用戶也許你要問編譯器優化一些功能與其他優化標誌。

這是可能的使用#pragma GCC optimize等...或者使用一些function attributes