PImpl 和 ABI 兼容性中的 unique_ptr

问题描述 投票:0回答:0

考虑使用 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 库将提供它的上下文中 - 又名:相同的硬件、操作系统等)?

相关:

c++ portability pimpl-idiom
© www.soinside.com 2019 - 2024. All rights reserved.