考虑使用 PImpl 的标准类实现,但使用
std::unique_ptr
来管理实现对象的生命周期:
class MyClass {
public:
class Impl;
MyClass();
~MyClass(); // Note: No default here
void someFunction();
private:
std::unique_ptr< Impl > m_impl;
};
因为我们没有默认任何标准函数(至少我认为有一个非默认构造函数可以防止编译器生成其他默认值,如移动赋值运算符),我们使用不完整的
MyClass::Impl
类型作为类型应该没有问题unique_ptr
. 的论证
现在,PImpl (afaik) 的目标是以 API 兼容的方式使用 C++。然而,据我所知,没有实际保证
std::unique_ptr
的实现具有完全相同的大小(以字节为单位)。因此,我似乎有可能(至少在理论上)针对一个 STL 实现编译我的库,然后尝试在使用不同 STL 实现的代码中使用它,实现 std::unique_ptr
具有不同的大小。这不会破坏 ABI 兼容性,因为现在假设跨 API 边界实例化的对象具有不同的大小,具体取决于您在边界的哪一侧?
因此:坚持使用 PImpl 习惯用法实际上是否 保证 ABI 兼容性(在相应的 C 库将提供它的上下文中 - 又名:相同的硬件、操作系统等)?
相关: