由於顯而易見的原因,C編譯器必須編譯所有對其他共享庫可見的函數,以便它們符合平臺的調用約定和其他ABI要求。但是,我已經瞭解到,對於可以保證永遠不會從外部模塊調用的函數,並不一定需要這樣做。在哪種情況下C編譯器允許忽略調用約定?
編譯器如何以及何時可以確定給定函數是否適用?
靜態函數是在同一個編譯單元只等功能可見的,因此,將是這樣的ABI破優化一個很好的候選人。但是指向靜態函數的函數指針仍然可以傳遞給其他模塊。編譯器是否嘗試確定函數指針是否傳遞到代碼中的任何位置?
gcc編譯器具有some extensions允許符號被聲明爲默認,隱藏或甚至內部,並且該文檔特別提到,此信息可用於執行一些種類的優化不可能外部可見funcitons。如果將函數指針傳遞給註釋爲內部函數的外部代碼,會發生什麼情況?
什麼是最好的方式來幫助編譯器執行儘可能多的優化,同時仍然保證與其他庫的互操作性?我是否應該只使用編譯器選項來將所有函數定義爲內部函數,並用所有需要在外部可見的函數的屬性覆蓋它?
在某些ARM系統上,在需要以與其他參數相同的方式或在FP寄存器中傳遞浮點值的代碼之間可能存在兼容性問題。如果不是函數指針,我想這個問題可以通過讓一個編譯器生成代碼來解決,該編譯器使用FPU生成一個帶有使用FPU寄存器的錯誤名稱的函數版本,以及一個「弱鏈接」一個未經修改的名稱,它將普通參數複製到FPU寄存器並調用損壞名稱的版本。 – supercat 2013-12-06 16:37:57
使用FPU並想要調用FPU寄存器版本的編譯器proudicng代碼將生成對mangled-name版本的調用以及將FPU寄存器複製到普通參數並調用非受損版本的弱鏈接包裝器。這應該允許調用者和被調用的代碼FPU使用的任何組合之間的「通用」行爲。至於函數指針,我認爲可以避免ABI方差的問題,除非聲明「特別」,否則它們總是指向使用最基本的ABI的方法。這似乎可行嗎? – supercat 2013-12-06 16:40:47