185得票12回答
PIMPL技法在实践中真正被使用吗?

我正在阅读Herb Sutter所著的书《Exceptional C++》,在这本书中我学习到了PIMPL惯用语法。基本上,这个想法是为一个类的私有对象创建一个结构,并动态地分配它们,以减少编译时间(同时更好地隐藏私有实现)。 例如:class X { private: C c; D ...

151得票11回答
为什么应该使用“PIMPL”习惯用语?

背景: PIMPL(指向实现的指针)是一种实现隐藏技术,其中一个公共类包装了一个在公共类所属的库之外看不到的结构或类。 这样可以隐藏用户库的内部实现细节和数据。 在实现此惯用法时,为什么要将公共方法放在 pimpl 类上而不是公共类上,因为公共类的方法实现会编译到库中,用户只有头文件? ...

132得票10回答
Pimpl惯用法 vs 纯虚类接口

我想知道程序员在选择Pimpl模式或纯虚类和继承时会有什么考虑。 我理解Pimpl模式对于每个公共方法都需要一个显式的额外间接引用,同时也存在对象创建开销。 而另一方面,纯虚类则带有隐式的间接引用(vtable)以供派生实现使用,我了解它没有对象创建开销。但如果你要从外部创建对象,则需要一...

69得票2回答
如何使用unique_ptr实现pimpl?

这是我在尝试使用unique_ptr来实现pimpl时遇到的问题。我选择unique_ptr,因为我希望类拥有指针 - 我希望pimpl指针和类的生命周期相同。 无论如何,以下是相关的头文件:#ifndef HELP #define HELP 1 #include <memory&gt...

65得票1回答
如何使用Qt的PIMPL惯用法?

PIMPL是“指向实现”的指针,实现是指“实现细节”,即类的用户不需要关心的内容。 通过使用PIMPL技巧,Qt自己的类实现将接口与实现清晰地分离出来。然而,Qt提供的机制是未记录的。如何使用它们? 我希望这个问题成为关于如何在Qt中实现PIMPL的标准问题。答案应该基于下面显示的简单坐标...

54得票4回答
我应该使用shared_ptr还是unique_ptr?

我正在使用pimpl方法创建一些对象,但我不确定是否应该使用std::shared_ptr还是std::unique_ptr。 我知道std::unique_ptr更高效,但对我来说这并不是很重要,因为这些对象本身就比较庞大,所以std::shared_ptr相对于std::unique_p...

51得票8回答
实践中的Pimpl技巧

在Stack Overflow上有一些关于“pimpl惯用语”的问题,但我更好奇它在实践中的使用频率。 我知道在性能和封装之间存在一些权衡,加上由于额外重定向而导致的一些调试烦恼。 在此基础上,这是应该根据每个类还是全部应用的东西?这是最佳实践还是个人偏好? 我知道这有点主观,所以让我列...

36得票2回答
为什么加一个空析构函数可以解决“error: invalid application of 'sizeof' to an incomplete type using unique_ptr”问题?

我正在将类STFT实现为Pimpl模式。在头文件中加入以下代码后可以通过编译: class STFT; // pimpl off to prevent point name clash class Whatever { private: STFT* stft; 并且在实现中:#in...

34得票7回答
不使用动态内存分配的Pimpl惯用语

我们希望在项目的某些部分使用pimpl模式。这些部分也恰好是禁止动态内存分配的部分,而这个决策不在我们的控制范围之内。 所以我的问题是,有没有一种干净而漂亮的实现pimpl模式的方法,而不需要动态内存分配? 编辑 以下是其他限制:嵌入式平台、标准C++98、无外部库、无模板。

26得票2回答
Pimpl - 为什么可以在不完整的类型上调用make_unique函数

为什么make_unique调用可以编译通过?难道make_unique不要求其模板参数为完整类型吗?struct F; int main() { std::make_unique<F>(); } struct F {}; 这个问题起源于我对我的PIMPL实现的“问题”: ...