在 c 中使用這樣的定義:
#define C1 42
#define C2 10
#define finalC C1 * C2
效率低下,因為即使可能不需要計算,此代碼也將始終在運行時運行?
uj5u.com熱心網友回復:
因為即使可能不需要計算,此代碼也將始終在運行時運行?
乘法很可能不會在運行時執行。例如,這個簡短的函式:
#define C1 42
#define C2 10
#define finalC C1 * C2
int foo() { return finalC; }
可以編譯成:
foo():
push rbp
mov rbp, rsp
mov eax, 420
pop rbp
ret
這沒有任何優化標志!
宏擴展發生在編譯器處理代碼之前;它被允許并且傾向于評估常量運算式。
PS - 使用的編譯器是 GCC 11.3,目標架構是 x86_64。
uj5u.com熱心網友回復:
沒有合理的編譯器會在運行時將此代碼乘以 42 乘 10。乘積 420 將在編譯期間計算(除非優化出來,因為在最終程式中甚至不需要它)。
宏定義和替換是在程式翻譯期間評估的,而不是在程式運行時評估的。
uj5u.com熱心網友回復:
這#define是對前處理器的指令,歷史上在編譯 C 之前對其進行了評估。這可用于在編譯到達 C 語法之前替換值或其他構造。為什么假設這#define會繞過編譯器優化?編譯器和優化器仍然會看到40 * 10
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/470605.html
標籤:C
上一篇:CodeIgniter4\Config\Service::my-instance-method在真正的$getShared上回傳NULL
