我正在使用POSIX dlopen
/ dlsym
API在运行时加载动态库,然后按名称从这些库中调用函数。
在某个地方存储dlsym
的结果,在性能方面是否是一个好主意?或者dlsym已经做了自己的缓存,并且添加另一层是无用的甚至是有害的?函数可能被多次调用,但我实际上没有办法提前知道哪些函数或者它们被调用的次数。
谢谢!
答案 0 :(得分:3)
dlsym
函数不执行任何缓存。它只是访问ELF符号表(使用其哈希表,但没有很好地实现)。
我认为你应该避免在同一个名字和库上多次调用dlsym
(例如数百万次)。
您可能会使用懒惰技术:例如这个名字和您的dlsym
中使用的库(在某些结构或类中)与dlsym
- ed函数指针一起调用,并且仅当该指针为空时才调用dlsym
。
您也可能希望尽快发现dlsym
失败。
FWIW,您可以多次拨打dlopen
和dlsym
。特别是,您可以在Linux上拥有数十万个dlopen
个共享库,正如我的manydl.c示例所示。但如果你的内部dlclose
- ed函数仍然有一个活动的调用框架,请避免使用dlsym
库。实际上,您可能永远不会调用dlclose
并且您的程序仍然可以工作(有轻微的进程地址空间泄漏)。