我应该缓存dlsym的返回值吗?

时间:2012-05-08 13:58:05

标签: c performance posix dynamic-linking dlsym

我正在使用POSIX dlopen / dlsym API在运行时加载动态库,然后按名称从这些库中调用函数。

在某个地方存储dlsym的结果,在性能方面是否是一个好主意?或者dlsym已经做了自己的缓存,并且添加另一层是无用的甚至是有害的?函数可能被多次调用,但我实际上没有办法提前知道哪些函数或者它们被调用的次数。

谢谢!

1 个答案:

答案 0 :(得分:3)

dlsym函数不执行任何缓存。它只是访问ELF符号表(使用其哈希表,但没有很好地实现)。

我认为你应该避免在同一个名字和库上多次调用dlsym(例如数百万次)。

您可能会使用懒惰技术:例如这个名字和您的dlsym中使用的库(在某些结构或类中)与dlsym - ed函数指针一起调用,并且仅当该指针为空时才调用dlsym

您也可能希望尽快发现dlsym失败。

FWIW,您可以多次拨打dlopendlsym。特别是,您可以在Linux上拥有数十万个dlopen个共享库,正如我的manydl.c示例所示。但如果你的内部dlclose - ed函数仍然有一个活动的调用框架,请避免使用dlsym库。实际上,您可能永远不会调用dlclose并且您的程序仍然可以工作(有轻微的进程地址空间泄漏)。