所有的智能指针(例如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所说,可能断言甚至没有进入你的程序的发布模式。
- 只有你可以决定你的应用程序可以接受多少开销。
- 正如大多数人指出的那样,您的发布版本可能无论如何都不会有断言。
- 在c++ 11中,您将使用
std::unique_ptr
,而不是Boost或已弃用的std::auto_ptr
。 - 如果你真的想保证你的代码不会触发断言,那么使用
get()
。
的例子:
B const& getMember() const
{ return *m_object.get(); }
这将为您返回原始指针