C C 靜態庫中的函式在這個靜態庫被使用時還有被inline的可能嗎

時間 2021-05-31 23:18:56

1樓:Alan Li

我想幫 @RednaxelaFX 大大再補充一點。答案R大已經說了,yes和no。

我猜題主想問的是如下這樣的情況:我們能不能內聯字尾名為.a或者.

dylib/.dll/.so檔案裡面的某個函式,雖然我們不知道它的實現是怎麼樣的?

在這種情況下答案是no。事實上,當我們生成了機器碼/彙編碼(包括relocatable machine code,即obj檔案)之後,內聯已經太遲了。

內聯的主要功能是去掉函式呼叫的開銷,另外內聯函式通常能夠暴露更多的其它的優化機會,而做這些優化是需要在編譯器的中間語言層面上進行的,所以內聯優化是在編譯時(compile time)進行的而不是在鏈結時(link time)進行的。Link time optimization事實上是把編譯時應該做的優化延後放到了鏈結時鏈結器裡面做,故而它不是真正意義上的鏈結時優化。

現有的編譯器都不能直接對機器碼或者relocatable machine code進行複雜優化,不單是因為非結構化的機器碼缺少程式分析,控制流和資料流的資訊,而且機器碼緊湊和已固定成型的結構是非常不適合做優化的。

以在機器碼/組合語言做inlining來舉例,當我們內聯某個函式的時候我們需要知道這個函式的執行邊界,這在機器碼裡是做不到的。我們甚至還不能對庫檔案做任何假設--萬一弄錯了呢?

為什麼C 中 void 能指向靜態成員函式但不能指非靜態向成員函式?

檀十一郎 讓我們來強行搞編譯器一波 class A fp A a A pa a pa fp.fpa fp.fp void 因為A test沒用到this,所以這麼搞也能工作。return 0 朱涵俊 靜態成員函式跟靜態函式沒區別,就是乙個作用域不同而已。可以看成普通的非成員函式。成員函式在傳引數時候...

一些Java庫中,建構函式為private,另設定靜態方法呼叫建構函式來初始化物件,是出於什麼考慮?

KobeLee 這個是站在使用者的角度去設計的。在使用者需要構造乙個A的物件時。你比較下下面兩種方式哪種對使用者更友好 A obj new A obj.setA x obj.setB y obj.setC z A obj A.of x,y,z 後者使用者不必關新你是怎麼構造出來A的,只需要知道我傳入...

指向函式的指標與指向類的非靜態函式指標有什麼不同?

BlueWanderer 假設類A有乙個成員x,然後我有乙個也叫x的成員指標指向A的乙個成員函式y,然後我有乙個A的例項a。於是,如果使用成員指標不需要.而是直接用.的話.我怎麼明確a.x是想呼叫成員函式y,而不是訪問原本的那個x?當然的確有辦法,只是遠沒有.好用 Aman 首先說 C 語言,假設有...