PIMPL和堆栈分配

Ant*_*ony 5 c++ pimpl-idiom heapalloc stackalloc

所以我一直在考虑PIMPL和堆栈分配.我一直在写一个库,并决定使用PIMPL隐藏该类的私有成员.这意味着我会有一个像这样声明的类

class Foo {
private:
    class Handle;
    std::tr1::shared_ptr<Handle> handle;
public:
    Foo();
};
Run Code Online (Sandbox Code Playgroud)

这很直接.但是然后在构造函数中你这样做

Foo::Foo() : handle(new Handle()) {}
Run Code Online (Sandbox Code Playgroud)

因此,当使用我的库的人在堆栈上创建Foo时,他们实际上是在进行堆分配.这是使用PIMPL时必须要考虑的权衡吗?我想在构造函数旁边发出警告释放文档:"警告:这会导致堆分配"或者其他一些问题.

我的另一个想法是将所有暴露给实现的类作为纯虚拟接口和一大堆静态工厂方法返回智能指针.这也意味着堆分配,但没有技巧.

有什么想法或建议吗?我是否过度考虑使用我的图书馆的程序员?

Jam*_*lis 4

这是您在使用 PIMPL 时必须忍受的权衡吗?

实际上,是的,尽管有一些技术,例如 Herb Sutter 在“The Fast Pimpl Idiom”中讨论的技术,可以用来消除或加速堆分配,但代价是增加复杂性。

我考虑发布文档,并在构造函数旁边添加警告:“警告:这会导致堆分配”或类似内容。

仅当有必要时才这样做(即,仅当您的用户会对您的类执行堆分配这一事实感到惊讶时)。许多类执行堆分配,包括 C++ 标准库中的许多类(例如,所有容器)。

我是否过于考虑使用我的库的程序员?

可能:-)。除非您对类有很高的性能要求,或者您希望类的实例被非常频繁地创建和销毁,否则我不会太担心。当然,如果你确实有显着的性能要求,pimpl 可能不是一个好的选择。