【问题标题】:Two way function calling (C++ Dynamic Libraries)两种方式的函数调用(C++ 动态库)
【发布时间】:2013-07-10 19:54:50
【问题描述】:

我知道,当您使用 dlopen() 加载动态 C++ 库时,您可以获得指向该库中函数的指针,但是有没有办法有效地(性能很重要)怎么办?

我知道我可以在库中调用一个函数(在初始化库时),传递一个指向函数的指针数组,或者只是将指针全部单独发送给一个函数。 (虽然数组可能会更好,因为它允许我添加函数但不需要更新所有旧插件)

我不确定这是否有效,因为可能有数百个函数,将所有这些函数发送到 10 个库可能效率不高。

但我对动态库不是很有经验,所以我想知道你们是否知道这样做更好。

编辑:也许将所有这些函数放在一个类中,然后通过函数调用发送一个类指针?那行得通吗?

【问题讨论】:

  • 获取函数指针的性能成本在总执行时间中占足够高的比例而值得担心是极不可能的。它甚至可能只是加载 dll 所需的 I/O 时间的一小部分。在知道自己有问题之前不要解决问题。
  • @MikeDunlavey 指针必须滚动并存储很多次,导致内存出现问题。
  • @sehe 其实我真的很想这样做,因为我很想学习更多关于 C++ 等的知识。
  • 你真的认为存储一千个指针会有问题吗?即使是 640K 也足够了!
  • 我不确定你为什么要这样做 - 库必须有一个它希望在任何使用该库的应用程序中找到的函数列表,这将极大地限制该库的用处。回调函数可能是更好的方法......

标签: c++ dynamic-loading


【解决方案1】:

“但我对动态库不是很有经验”

这就是暗示:你不想这样做。

也许看看Boost Extension(不是 boost 的官方部分),这里采用高级 C++ 方法。

也就是说,大多数平台都在一定程度上支持这一点。例如。 AIX 上的 XlC++ 具有 rtld(需要显式的“导出”符号映射,IIRC),我在 windows 和 linux 上也有同样的工作(我们的第 3 方工作流引擎需要它)。发送 fptrs 数组似乎最实用,更接近“插件”模式。

【讨论】:

  • 也许将所有这些函数放在一个类中,然后通过函数调用发送一个类指针?这行得通吗?
  • 我不建议在没有侧轮的情况下这样做。但是,是的,原则上没有大问题。注意事项:ABI 兼容性(使用相同的编译器 and 标志构建所有库);跨模块边界的异常支持;名称修改和RTTI 的未记录性质
  • 你的意思是,如果我指向一个使用不同编译器或不同设置编译的类,它将无法工作?:O
  • 是的,他就是这个意思。如果你很幸运,你会得到一个错误。很可能你会得到更糟糕的结果。
  • 只要确保您针对构建,针对完全相同的共享(运行时)库运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
相关资源
最近更新 更多