如何拒絕編譯器將函式內聯處理

時間 2021-05-29 22:57:51

1樓:悽臨雨

題目描述裡居然是講跨單元編譯……

非成員函式extern inline就完事了,那樣本地呼叫會inline,外部呼叫會呼叫副本。

MSVC 成員函式__declspec(noinline) inline聯合使用,其中inline會使此函式體可以存在於標頭檔案中不會重複定義,noinline可以使具體呼叫時用call來呼叫而不內聯。

gcc也有__attribute__((noinline)) ,這個我沒試驗過它對跨單元編譯的影響就不說了

如果想知道如何強制noinline地呼叫inline函式(用於節省程式體積、效能考慮),看下面

新鮮出爐,GCC MSVC CLANG ICC全部通過,(在O2下)不丟效能。O0下會丟一點點,加上_DEBUG巨集判斷就沒事了

2樓:原子筆

把C函式func1宣告為static的,再extern 宣告乙個全域性函式指標變數func2,再在某地定義func2的值是func1的位址。這樣func2可以像函式一樣用,而且呼叫絕對不會內聯。

3樓:藍色

除了GCC和MSVC的noinline語法,我想你也可以試試函式指標,構造出乙個functions call site給後面的object使用。

void(*

ptrfunc

)(int

);ptrfunc

=some_func

;ptrfunc(25

);而寫到這裡的時候,我的確也測試了一下你說的有關類加上__attribute__(noinline),的確如樓主所說的還是被inline了。

如:#include

但是,如上文所說,我們可以手動把這個function call site弄出來,因為inline的本質就在這裡

這樣就可以出來了。

4樓:Gomo Psivarh

gcc:

void __attribute__ ((noinline)) maki

VS:void __declspec(noinline) maki

如何開發編譯器?

gitlab.gnome.org GNOME vala issues?milestone title 1.0 發展中的編譯器,正好可以做學習和研究。 Anges 說一下做過的編譯器前端部分 動態生成語法樹,詞法解析,主要利用狀態機,更高階點nfa轉行dfa,其實解析起來也沒有大家說的那麼難,會基本的...

編譯器是如何編譯自己的?

何源 比如你是馬雲,沒身份證 編譯器 之前怎麼證明自己是馬雲。那你得弄來一張名為馬雲的身份證 編譯器 問題來了,這張身份證怎麼來呢?你去找你爸要了戶口本 其他語言的編譯器 去派出所填寫了自己的資料 自己編譯器原始碼 辦理身份證,因為戶口本上你的名字是馬雲,派出所給了一張名為馬雲的身份證。從此,你不用...

編譯器是如何工作的?

就事論事的話,推薦你讀Neil Jones 等著的Automatic Partial Evaluation and Program Generation,這本書的開頭應該解決了你想的問題.至於你想知道編譯器中間過程的原理,可是本來編譯器就是把乙個語言變成另乙個語言的程式.建議你先讀讀EoPL3的1 ...