C++ pimpl中使用void指针的优缺点

Advantage and disadvantage of using void pointer in C++ pimpl

我正在尝试研究 C++ 的 pimpl 技术。看了网上的一些文章,发现pimpl有两种不同的方法,一种是

class X
{
  public:
    X(...parameters...)
    ~X()
  private:
    struct Impl;
    Impl* impl_;
};

另一种方法是使用原始空指针,例如

class X
{
  public:
    X(...parameters...)
    ~X()
  private:
    void * impl_;
};

然后使用static_cast将void指针转换回原来的类型。

这两种方式比较有什么优缺点?

谢谢!

不要使用 void* 来实施 pimpl,或与此相关的任何事情。它没有任何好处;并且有一个潜在的问题,如果你 static_cast 由于某种原因输入错误的类型,你将有未定义的行为。

前向声明您的实现 class 很容易,就像您在第一个示例中所做的那样。这才是实现pimpl的正确方法。

对于第一个,使用调试器您将能够查看 impl 指针及其数据成员值。如果你有一个 void* 指针,你将无法执行 that.The 第二个选项没有提供我所知道的任何优势。

不管怎样,如果你有

Impl* GetImpl() { return impl_; }

Impl* GetImpl() { return static_cast<Impl*>(impl_); }

这两个函数将生成完全相同的汇编代码。

如果您不需要 getter,您可以这样设置: struct Impl* impl_; 还有。