![](/img/trans.png)
[英]Should I use matching (gcc) compiler optimization flags when profiling the code?
[英]Is it possible to use GCC to compile one section of a code file with specific compiler flags?
是否可以使用GCC編譯具有特定編譯器標志的代碼文件的一部分? 例如,假設我有一些正在測試的功能。 我希望這些功能嚴格遵守標准,因此我想使用--pedantic標志對其進行編譯。 但是進行測試的代碼在編譯時會發出很多警告。 有沒有辦法用--pedantic編譯那些特定功能?
另外,假設我有一個精心編寫但非常昂貴的函數,需要盡快運行。 如何使用-Ofast編譯該函數(以及其他一些函數),並使用-O2或-O3編譯程序的其余部分?
實際上,可以使用#pragma optimize
語句,或使用__attribute__((optimize("-O3")))
可以在此處找到所有優化選項。
一個簡單的例子是:
#include <stdio.h>
// Using attribute
__attribute__((optimize("-O3"))) void fast_function_attribute()
{
printf("Now calling a slow function, compiled with -O3 flags.\n");
}
__attribute__((optimize("-O1"))) void slow_function_attribute()
{
printf("Now calling a slow function, compiled with -O1 flags.\n");
}
// Using #pragma
#pragma GCC push_options
#pragma GCC optimize ("-O3")
void fast_function_pragma()
{
printf("This will be another fast routine.\n");
}
#pragma GCC pop_options
#pragma GCC push_options
#pragma GCC optimize ("-O1")
void slow_function_pragma()
{
printf("This will be another slow routine.\n");
}
#pragma GCC pop_options
int main(void)
{
fast_function_attribute();
slow_function_attribute();
fast_function_pragma();
slow_function_pragma();
}
如果您使用的是不同的編譯器,我強烈建議您使用宏將它們包裝起來(或使用pragma語句而不是__attribute__
以避免任何編譯器警告。
是。
#include <iostream>
#pragma GCC diagnostic push
#pragma GCC diagnostic warning "-Wpedantic"
#pragma GCC push_options
#pragma GCC optimize ("O0")
void bob(){
std::cerr<<"Sandwich maker!"<<std::endl;
}
#pragma GCC diagnostic pop
#pragma GCC pop_options
int main(){
bob();
}
push_options
和diagnostic push
將優化和診斷標志保存,然后將其更改為pedantic和O0
(或O1
, O2
, O3
, Os
, Og
)。 pop
指示符將恢復原始設置。
GCC在某些情況下允許這樣做,但並非全部。
對於優化選項,可以使用optimize
function屬性或等效的#pragma
指令 。
對於警告選項,它的可靠性較差。 我認為它只是一個實用工具,而不是函數屬性,並且它顯然不支持所有警告。
對於警告或優化以外的其他選項,除了使用單獨的文件外,我不知道有任何其他方法可以做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.