2

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

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

谢谢!

4

1 回答 1

3

dlsym函数不做任何缓存。它只是访问 ELF 符号表(使用它的哈希表,实现得不是很好)。

我认为您应该避免dlsym多次调用相同的名称和库(例如数百万次)。

您可能会使用惰性技术:将dlsym调用中使用的名称和库(在某些结构或类中)与dlsym-ed 函数指针放在一起,并且dlsym仅在该指针为空时调用。

您可能还希望尽快发现dlsym故障。

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

于 2012-05-08T14:04:44.447 回答