C++智能指针取消引用 - 检查它是否已初始化的开销是多少?



所有的智能指针(例如boost::scoped_ptr, boost::optional, std::auto_ptr等)都做断言来检查内部指针是否初始化。对它进行解引用的次数不多,但如果解引用的次数真的很大(数不胜数,数不胜数)怎么办?
例如,有一个类:

class A
{
public:
A( std::auto_ptr< B > _someObject )
  : m_object( _someObject ) {}
B const& getMember() const
{ return *m_object; }
private:
 boost::scoped_ptr< B > m_object;
};

someObject总是不为空,并且getMember()在某些地方被调用了很多次。在每次调用时,都在m_object内部进行断言。
是更可取的使用原始指针代替?当然,这会导致创建析构函数来删除原始指针。
在这种情况下,断言会产生一些明显的影响吗?还是可以忽略不计?

-DBOOST_DISABLE_ASSERTS编译你的程序并进行比较。但是我冒昧地说,对于断言的性能损失可以忽略不计。正如@Travis所说,可能断言甚至没有进入你的程序的发布模式。

  1. 只有你可以决定你的应用程序可以接受多少开销。
  2. 正如大多数人指出的那样,您的发布版本可能无论如何都不会有断言。
  3. 在c++ 11中,您将使用std::unique_ptr,而不是Boost或已弃用的std::auto_ptr
  4. 如果你真的想保证你的代码不会触发断言,那么使用get()

的例子:

B const& getMember() const
{ return *m_object.get(); }

这将为您返回原始指针

相关内容

  • 没有找到相关文章

最新更新