如何避免 std::vector<double> 代码的多个副本?

问题描述

我有一个共享库——我们称它为 master。它产生一个或多个从属共享库。从共享库通过接口与主共享库交互,交换 std::string、std::vector 等。 从属共享库的编译时间必须最小化,因为此编译是在客户站点动态完成的。

只要交换的对象不是 STL 容器,一切正常。例如

  • master 编译 NonStlObject.cpp 和 NonStlObject.h 并生成全局文本符号 (T)
  • 客户端使用 NonStlObject.h 并创建未定义的全局文本符号 (U)

一旦 STL 容器被交换,我就会得到 STL 代码的 1 + numberOfSlaves 副本——以及匹配的编译时间——它们在主节点和从节点中都是弱符号 (W)。

除了包装每个 STL 容器之外,还有什么办法可以避免这种情况吗?

附注。我不想被告知,用于构建交互共享库的编译器版本必须相同。当然必须!

PPS。 extern 模板在应用于 std::vector 时似乎被编译器忽略

解决方法

我最终得到了 1 + numberOfSlaves 份代码

这是您最少的问题。

更大的问题是,在 C++ 中跨不同版本的编译器实现 ABI 兼容性真的很困难。

如果您使用 g++-9.0 编译代码,并且您的客户安装了 g++-7.0,那么您的代码很可能根本无法运行。

您当然可以要求客户安装 9.0,但是他们可能无法构建他们的其他程序。

或者他们可以使用 g++-10.0,然后如果/当 std::string 更改其 ABI 并且不再与您的“主”库兼容时,您可能会开始看到崩溃。

除了包装每个 STL 容器之外,还有什么办法可以避免这种情况吗?

包装每个 STL 类并通过 C 接口传递它肯定解决了“ABI 不兼容”问题,但我不明白它是如何解决“我有 N+1 个 STL 副本”问题的(我不确定后一个问题首先需要解决)。