[英]How to get the gcc compiler to not optimize a standard library function call like printf?
出於好奇,我想知道gcc是否可以通過某種方式不優化任何函數調用?
在生成的匯編代碼中,printf函數由putchar代替。 即使使用默認的-O0
最小優化標志,也會發生這種情況。
#include <stdio.h>
int main(void) {
printf("a");
return 0;
}
( Godbolt顯示GCC9正在執行此操作,clang8使其保持不變。)
使用-fno-builtin
可以禁用所有標准C函數的替換和內聯操作。
或將-fno-builtin-FUNCNAME
用於特定功能,例如-fno-builtin-printf
。
默認情況下,某些常用的標准C函數被作為內置函數處理,類似於__builtin_popcount
。 printf的處理程序將其替換為putchar或puts(如果可能)。 https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
默認情況下,不會將諸如printf("a")
類的C語句的實現細節視為可見的副作用,因此不會保留任何東西。 您仍然可以在調用站點上設置斷點並進入函數(至少在asm或如果安裝了調試符號的情況下,在源代碼模式下)。
要為單個函數禁用其他類型的優化,請參見函數上的__attribute__((optimize(0)))
或#pragma GCC optimize
。 但要注意:
最
optimize
屬性應僅用於調試目的。 它不適用於生產代碼。
您不能禁用所有優化。 gcc通過內部表示形式轉換為asm的方式中固有的一些優化。 請參閱禁用GCC中的所有優化選項 。
例如,即使在-O0
gcc也會將x / 10
優化為乘法逆。
它仍然將所有內容存儲在C語句之間(用於一致調試; 這是-O0
真正含義 ); gcc沒有嘗試完全將C音譯為asm的“完全啞”模式。 為此使用tcc
。 Clang和帶有-O0
ICC比gcc的字面意義更大,MSVC調試模式也是如此。
請注意, -g
永遠不會對代碼生成產生任何影響,僅會對發出的元數據起作用。 GCC使用其他選項(主要是-O
, -f*
和-m*
)來控制代碼生成,因此,除了較大的二進制文件外,您始終可以安全地啟用-g
而不會影響性能。 這不是調試模式 (即-O0
),而僅僅是調試符號 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.