首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >__declspec(dllimport)必要性

__declspec(dllimport)必要性
EN

Stack Overflow用户
提问于 2013-04-04 21:10:04
回答 2查看 289关注 0票数 3

我在看这个:Importing Function Calls Using __declspec(dllimport)和我不明白为什么真的需要__declspec(dllimport)?为什么链接器不能在链接阶段调用DWORD PTR __imp_func1 (IAT table address)来调用func1,从而避免在源代码中单独声明?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-04 21:46:25

引用Raymond Chen的话: call func是5字节长,但是call dword ptr _imp_func是6字节长。这个补丁不合适。它太大了一个字节。在每个调用指令后面添加一个nop (只是为了防止它被导入)听起来有点过分。

票数 1
EN

Stack Overflow用户

发布于 2014-01-22 14:28:57

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

代码语言:javascript
复制
// 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() {}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15812196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档