gpt4 book ai didi

windows - __declspec(dllimport) 的必要性

转载 作者:可可西里 更新时间:2023-11-01 09:25:16 32 4
gpt4 key购买 nike

我在看这个:Importing Function Calls Using __declspec(dllimport)而且我不明白为什么真的需要 __declspec(dllimport)?为什么链接器不能在链接阶段将调用 func1 修补为调用 DWORD PTR __imp_func1(IAT 表地址)从而避免在源中单独声明的需要?

最佳答案

补丁指令空间不足可能是一个原因,但不是主要原因。即使有足够的空间,链接器仍然不会修补它以获得更好的性能。原因是链接器不做或修改编译器后端生成的代码,它只是用重定位信息修补地方。下面的例子不是很好的编码风格,但清楚地解释了问题。 bar() 生成的指令是 call dword[_imp__bar],它有 6 个字节长,即使链接器知道 bar() 在最终图像中定义,它不会用只需要 5 个字节的 call OffsetOfBar 对其进行修补。延迟代码生成到链接时间(将/GL 传递给 cl.exe)可以解决这个问题,因为链接器将在链接时间调用编译器后端,后端将生成优化的 call 指令因为它知道 call 目标在同一模块中。

// main.c
// compile it with 'cl.exe /Zi /O2 main.c bar.c'

__declspec(dllimport) void bar();

int main() {
bar();
}

// bar.c
void __declspec(noinline) bar() {}

关于windows - __declspec(dllimport) 的必要性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15812196/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com