2

所有智能指针(例如 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 中进行断言。
是否最好使用原始指针?当然,这会导致析构函数创建删除原始指针。
在这种情况下,断言会产生一些明显的影响吗?还是仍然可以忽略不计?

4

2 回答 2

4

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

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

例子:

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

这将为您返回原始指针。

于 2013-06-18T17:42:32.923 回答