__declspec(dllexport)
来源:互联网 发布:地图软件有哪些 编辑:程序博客网 时间:2024/04/30 09:01
转自:http://hi.baidu.com/deathsoft/item/f13901f6fa6921c7a935a25e
按照MSDN说明,当链接dll的导出函数时,只需要包含头文件和lib,__declspec(dllimport)修饰符不是必须的,但加上该修饰能使导出函数的调用效率更高。那么,究竟原因是什么?
假设dll导出了一个函数:
extern "C" __declspec(dllexport) void fun();
如果程序中声明不加__declspec(dllimport),查看调用fun()函数的汇编代码:
004010AD call fun (004010d8)
其中fun被定义为一个标号(label),如下:
fun:
004010D8 jmp dword ptr [__imp__fun (0040e0e8)]
上面的符号__imp__fun指向的地址为fun()函数在exe中的导入节。
当声明加上__declspec(dllimport)后,查看调用fun()函数的汇编代码:
004010AB call dword ptr [__imp__fun (0040e0e8)]
从上面可以看出,加上__declspec(dllimport),编译器链接dll将省略一条jmp语句。
这是因为:
1。如果导出函数的声明没有用__declspec(dllimport) 修饰的话,编译器并不知道这个函数是由DLL导出的,所以编译器就把这个函数当作普通的外部引用来对待,产生一个外部引用的符号等着链接器解析。当链接器工作的时候,它是不能修改编译器生成的结果,所以会将该符号解析为对相应函数调入节的间接调用。
2。如果导出函数的声明用__declspec(dllimport) 修饰的话,编译器一开始就知道这个函数是DLL导出函数,直接编译成对调入节的调用。
- __declspec(dllexport)
- __declspec(dllexport)
- __declspec(dllexport):
- __declspec(dllexport)
- __declspec(dllexport)
- __declspec(dllexport)
- __declspec(dllexport)
- __declspec(dllexport)
- __declspec(dllexport)
- __declspec(dllexport)
- __declspec(dllexport)
- __declspec(dllexport)/__declspec(dllimport)
- __declspec(dllexport) & __declspec(dllimport)
- __declspec(dllexport) & __declspec(dllimport)
- __declspec(dllexport) & __declspec(dllimport)
- __declspec(dllexport) & __declspec(dllimport)
- __declspec(dllexport) & __declspec(dllimport)
- __declspec(dllexport) & __declspec(dllimport)
- Oracle 中 decode 函数用法
- C++ inlinie
- socketpair
- Java ScriptEngine解析脚本学习
- 游戏更新-围棋练习大全-Android
- __declspec(dllexport)
- 在Linux中使用非阻塞的socket的情形下
- 【科研论文】基于Zigbee与以太网的智能家居系统设计–基于W5300
- Git命令小记
- Java中的类装载器(ClassLoader)
- cannot load such file -- openssl 用gem安装rails时遭遇的错误
- google play网页改版后查看英文评论的方法
- makefile
- 激光散斑测量