【问题标题】:ABI in pimpl idiom with unique_ptr带有 unique_ptr 的 pimpl 成语中的 ABI
【发布时间】:2014-08-30 16:11:27
【问题描述】:

我的目标是为我的新库提供 abi 兼容性。 我期待使用 unique_ptr 而不是原始指针。但是我担心如果我更新标准库,我可能会破坏 abi。这是真的吗?在未来的 stdlib 版本中是否保证 unique_ptrs 的双稳定性?

【问题讨论】:

    标签: c++11 unique-ptr abi pimpl-idiom


    【解决方案1】:

    正如您在this blog post 中看到的那样,该问题是已知的并且正在解决中。就目前的情况而言,恐怕您能做的最好的事情就是与您的编译器供应商核实他们是否提供任何保证(例如,不会在次要版本中破坏 ABI)。

    【讨论】:

    • 您能否编辑您的答案以添加有关如何解决问题的更多详细信息?我找不到那个会议演讲,所以目前这个答案并没有提供太多信息。
    • 我对 C++ 不是很了解,因为我已经很多年没有使用它了,我的印象是从那以后在这个主题上几乎没有发生什么。参见例如this Reddit thread
    【解决方案2】:

    当您使用自定义删除器时,问题就出现了。 unique_ptr(与 shared_ptr 不同)析构函数需要知道对象的完整类型。所以需要在数据成员声明中指定删除器:

    class Foo {
    private:
       std::unique_ptr <FooImpl> _pimpl;
    };
    

    在实例化 pimpl 时,您必须使用默认删除器。 如果你想要一个自定义的删除器,你需要在声明中指定它

    class Foo {
    private:
       std::unique_ptr <FooImpl,  std::function <void (FooImpl*&)> > _pimpl;
    };
    

    但是,您无法灵活选择是否希望 unique_ptr d'tor 调用默认删除器或自定义删除器。 更灵活的选项是第二个版本,但如果您选择保留默认行为,则必须使用与默认删除等效的特定删除器实例化 unique_ptr。

    IMO,这是将 unique_ptr 用于 pimpl idiom 的一个重大缺点。

    【讨论】:

      猜你喜欢
      • 2015-07-16
      • 2017-09-09
      • 2010-10-04
      • 2015-04-15
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多