簡體   English   中英

如何使gcc編譯器不優化諸如printf之類的標准庫函數調用?

[英]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.

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