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_;
还有。
我正在尝试研究 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_;
还有。