引用 DLL 導出函數時,頭文件若不加 __declspec(dllimport) 程序也能正常運行,但加上後調用效率更高。
無 dllimport 時:
call fun ; 編譯器視為普通外部符號
fun:
jmp dword ptr [__imp__fun] ; 鏈接器生成跳板
有 dllimport 時:
call dword ptr [__imp__fun] ; 直接間接調用,省去 jmp
dllimport:編譯器不知是 DLL 導出,產生外部符號引用,鏈接器只能生成跳板(thunk)轉跳至導入地址表(IAT)。dllimport:編譯器知曉是 DLL 導出,直接生成 call [IAT] 指令,省去一次跳轉。雖然現代鏈接器優化可能消除跳板,但显式声明 dllimport 仍是最佳實踐,確保生成最優代碼並明確接口意圖。