PIMPL和堆栈分配
-
13-09-2020 - |
题
所以我一直在考虑pimpl和堆栈分配。我一直在编写一个图书馆,并决定使用Pimpl来隐藏课堂的私人成员。这意味着我将有一个像这样宣称的阶级
class Foo {
private:
class Handle;
std::tr1::shared_ptr<Handle> handle;
public:
Foo();
};
.
它非常直接。但是,在构造函数中,你这样做
Foo::Foo() : handle(new Handle()) {}
.
因此,当使用我的图书馆的某人在堆栈上创建一个foo时,他们基本上是堆分配的。这是使用PIMPL时必须与之生活的权衡吗?我想在构造函数旁边发出警告发布文件:“警告:这导致堆分配”或SomeSuch。
我的另一个思想是拥有所有课程,它暴露于实现为纯虚拟接口以及返回智能指针的整个静态工厂方法。这也意味着堆分配,但没有伎俩。
任何思想或建议?我使用我的图书馆过度考虑程序员吗?
解决方案
是使用Pimpl时必须与之生活的权衡吗?
有效,是的,尽管有技术,如在“中讨论的那些快速Pimpl成语,“可以用于消除或加速堆分配的”
只有在必须这样做(即,只有您的用户对您的班级执行堆分配的事实感到惊讶)。许多类执行堆分配,包括C ++标准库中的许多那些(例如,所有容器)。我想在构造函数旁边发出警告发布文档:“警告:这导致堆分配”或SomeSuch。
我是使用我的图书馆的程序员过度考虑吗?
可能:-)。除非您对您的课程有很高的性能要求,否则您预计您的课程的实例被创建并经常销毁,我不会担心它。当然,如果您确实具有重要的性能要求,Pimpl可能不是一个不错的选择。
其他提示
因此,当使用我的图书馆的某人在堆栈上创建一个foo时,他们基本上是堆分配的。这是使用PIMPL时必须与之生活的权衡吗?
YEP。
我想在构造函数旁边发出警告发布文档:“警告:这导致堆分配”或SomeSuch。
我认为超强评论:)如果您的课程是如此表现关键,也许您应该避免Pimpl成语。如果您代表一个数字,这可能会有关和值得注意。如果您隐藏了数据库连接的实现,不值得注释:)
我的另一个思想是拥有所有课程,它暴露于实现为纯虚拟接口以及返回智能指针的整个静态工厂方法。这也意味着堆分配,但没有伎俩。
是的,对用户来说,这有点明显,但再次可能有关自己的价值。
任何思想或建议?我使用我的图书馆过度考虑程序员吗?
有一个权衡,但如果您的课程足够复杂,可以从PIMPL成语中获得足够的,您可能会假设堆分配可以。如果我在使用你的图书馆,它可能与我无关。
不隶属于 StackOverflow