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

我正在研究C ++的pimpl技术。 在网上浏览了一些文章后,我发现pimpl有两种不同的方式,一种是

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

另一种方法是使用一个原始的void指针,就像

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

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

比较这两种方式有哪些优缺点?

谢谢!


不要使用void*来实现一个pimpl,或者对于这个问题的任何事情。 它没有提供任何好处; 并有潜在的问题,如果你由于某种原因将static_cast转换为错误的类型,你将会遇到未定义的行为。

正如你在第一个例子中那样,转发声明你的实现类很容易。 这是实施pimpl的正确方法。


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

无论哪种方式,如果你有

Impl* GetImpl() { return impl_; }

要么

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

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

如果你不需要getter,你可以改为像这样: struct Impl* impl_; 以及。

链接地址: http://www.djcxy.com/p/79941.html

上一篇: Advantage and disadvantage of using void pointer in C++ pimpl

下一篇: Auto Pointer Issue