c++ - PIMPL 和堆栈分配

标签 c++ pimpl-idiom heapalloc stackalloc

所以我一直在思考PIMPL和堆栈分配。我一直在编写一个库,并决定使用 PIMPL 来隐藏该类的私有(private)成员。这意味着我将有一个这样声明的类

class Foo {
private:
    class Handle;
    std::tr1::shared_ptr<Handle> handle;
public:
    Foo();
};

这很简单。但是然后在构造函数中你这样做

Foo::Foo() : handle(new Handle()) {}

因此,当使用我的库的人在堆栈上创建 Foo 时,他们实际上是在进行堆分配。这是您在使用 PIMPL 时必须忍受的权衡吗?我想在构造函数旁边发布带有警告的文档:“警告:这会导致堆分配”或类似的内容。

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

有什么想法或建议吗?我是不是对使用我的库的程序员考虑过度了?

最佳答案

Is this the trade-off you have to live with when using PIMPL?

有效,是的,尽管有一些技术,例如 Herb Sutter 在 "The Fast Pimpl Idiom," 中讨论的技术可用于消除或加速堆分配,但代价是更复杂。

I thought of releasing the documentation with a warning next to constructors: "WARNING: This results in a heap allocation" or somesuch.

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

Am I being overly-considerate of programmers using my library?

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

关于c++ - PIMPL 和堆栈分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3221635/

相关文章:

c++ - 正在打印空指针未定义行为吗?

c++ - Objective-C 实例到 C++ 类

c++ - Pimpl with unique_ptr : Why do I have to move definition of constructor of interface to ".cpp"?

c++ - Pimpl 习惯用法作为模板基类

c - 为内存数据结构寻找安全的魔数(Magic Number)

c++ - Qt - 为什么无法使用带有从 FileDialog 获取的目录的 QFile 读取文件?

C++ 在构造函数中设置类成员数组的二维数组大小

c++ - 连接 2 个 char* 会产生奇怪的结果

c++ - Windows C 代码的内存分配