在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_;
以及。
上一篇: Advantage and disadvantage of using void pointer in C++ pimpl
下一篇: Auto Pointer Issue