我的印象是,出于各种原因,当模块可以使用不同版本的标准库或不同的编译器进行编译时,在模块之间传递标准库对象(尤其是模板对象)是不安全的。我现在的目标是为此找到一个可行的解决方案,尤其是在共享指针和字符串的情况下。
想到的可能的解决方案包括:
- C 和其他永不改变的基本类型(不可能,因为需要更复杂的类型)
- 来自标准化库的类型,或者:
- 自定义实现(这需要添加字符串和此类类,老实说这听起来很糟糕)
- 一些外部库已经提供了这样的东西(首先想到的是 Boost,但即使没有涉及的膨胀,它似乎也太重模板而无法工作)
- 一些神奇的情况实际上使它安全(在所有情况下,除了 shared_ptr)
真正的问题似乎是严重依赖于模板的共享指针。
是否传递标准库对象等问题已被多次询问,并且在某些情况下总是回到坏事,但一个不涉及编写大量代码的实际解决方案已经完成了数十次的时间似乎很少见。
有没有不涉及实现内部引用计数和自定义字符串的解决方案,或者这只是为了跨版本/编译器/平台安全而必须付出的代价?
最佳答案
如果您使用不同的编译器来编译您的模块,除了将您的类分解为它们的普通成员类型并分别传递它们之外,没有其他解决方案。 如果您使用相同的编译器并且只是它的不同版本,那么很可能模块已经兼容(除非 ABI 发生变化,例如类布局等)。 此外,标准 C++ 库类型的 ABI 可能已经更改,在这种情况下,您可以通过使用第三方库来解决它,它提供相同的功能,但保证二进制兼容性(例如 Qt 就是这样做的)。 但这也不是一个完美的解决方案,因为您的主程序使用的库必须比所有模块链接的库版本更新。但这通常就足够了,因为通常您只需要旧插件继续与您的程序的新版本一起工作,而不是新插件与您的程序的旧版本一起工作。
关于c++ - 在模块之间传递对象的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7703790/