gpt4 book ai didi

c++ - 实践中的 Pimpl 成语

转载 作者:IT老高 更新时间:2023-10-28 13:59:00 27 4
gpt4 key购买 nike

关于 pimpl idiom 有一些关于 SO 的问题,但我更好奇它在实践中的使用频率。

我了解在性能和封装之间需要权衡取舍,另外由于额外的重定向会导致一些调试烦恼。

这样,这是应该在每个类(class)还是全有或全无的基础上采用的东西?这是最佳实践还是个人偏好?

我意识到这有点主观,所以让我列出我的首要任务:

  • 代码清晰
  • 代码可维护性
  • 性能

我总是假设我需要在某个时候将我的代码公开为一个库,所以这也是一个考虑因素。

编辑:欢迎提出任何其他选项来完成同样的事情。

最佳答案

我想说的是,您是按类(class)还是全有或全无的基础上进行这取决于您首先选择 pimpl 成语的原因。在建立图书馆时,我的原因是以下之一:

  • 想要隐藏实现以避免泄露信息(是的,这不是 FOSS 项目:)
  • 想要隐藏实现以减少客户端代码的依赖性。如果您构建一个共享库 (DLL),您可以更改您的 pimpl 类,甚至无需重新编译应用程序。
  • 希望减少使用库编译类所需的时间。
  • 想要修复命名空间冲突(或类似问题)。

这些原因都不会提示采用全有或全无的方法。在第一种情况下,您只需要隐藏您想要隐藏的内容,而在第二种情况下,对于您希望更改的类来说这样做可能就足够了。同样出于第三和第四个原因,只有隐藏重要的成员才能受益,而这些成员又需要额外的 header (例如,第三方库,甚至 STL)。

无论如何,我的观点是我通常不会觉得这样的东西太有用:

class Point {
public:
Point(double x, double y);
Point(const Point& src);
~Point();
Point& operator= (const Point& rhs);

void setX(double x);
void setY(double y);
double getX() const;
double getY() const;

private:
class PointImpl;
PointImpl* pimpl;
}

在这种情况下,权衡开始打击你,因为需要取消引用指针,并且不能内联方法。但是,如果您只为非平凡的类执行此操作,那么通常可以容忍轻微的开销而不会出现任何问题。

关于c++ - 实践中的 Pimpl 成语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/843389/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com