Swift是一種預編譯語言,所有物件都轉換為記憶體地址;但是,Swift 中有一個特殊的“選擇器”,它允許在運行時通過函式名找到函式。這是如何作業的?這是否意味著命名功能會影響運營效率?
uj5u.com熱心網友回復:
不,函式名稱不會對 Swift 中的性能產生有意義的影響。
一旦編譯到您的程式中,函式和方法名稱以兩種主要方式使用:
- 當通過名稱直接(靜態)呼叫函式時,編譯后的代碼參考符號(函式名稱,轉換為適合包含在生成的二進制代碼中的格式) - 然后在鏈接期間轉換為常量跳轉操作,或者靜態或動態
- 簡化:函式名對呼叫函式沒有影響;撥打電話時不會以任何方式考慮
- 當使用 Objective-C 運行時動態呼叫函式時(例如,作為選擇器),函式名稱用于在類的方法快取中查找適當的方法。選擇器在程式中是唯一的,因此函式/方法名稱被映射到全域唯一的選擇器,然后用于查找(按指標,而不是按名稱)
- 當您靜態參考選擇器時(例如使用
#selector(...)),唯一的選擇器會被預編譯到您的程式中,因此在運行時不需要查找名稱,而是可以在呼叫方法時直接使用選擇器指標本身 - 如果您動態參考選擇器(例如
NSSelectorFromString(...)),則從給定名稱動態查找選擇器(在唯一選擇器的全域表中),如果未找到,則在運行時動態創建一個新選擇器
- 當您靜態參考選擇器時(例如使用
在 (1) 和 (2a) 兩種情況下,函式的名稱在呼叫程序中從未真正使用過,并且是無關緊要的。在情況(2b)中,它在技術上是(用于選擇器查找),但程序是如此之快以至于它真的無關緊要。方法名稱很少長,因為它們通常是手動輸入的,并且與程式可以執行的大多數操作相比,即使是最動態的用例(在運行時手動查找方法)也是如此微不足道,您真的不應該擔心關于它。
另一個考慮因素:當您編譯一個嵌入了符號的程式時,這些符號會占用二進制檔案中的空間。您也不應該真正擔心這一點,因為:
- 程式的發布版本將洗掉大部分符號,并且
- 由于代碼的原因,與二進制檔案的大小相比,占用的空間符號量通常也完全無關緊要
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/417687.html
標籤:
下一篇:小數到uint8_t陣列
