C ++智能指针解除引用 - 检查它是否被初始化的开销是多少?

时间:2013-06-18 17:25:39

标签: c++ performance smart-pointers

所有智能指针(例如,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始终不为null,并且getMember()的某个地方被调用了很多次。在每次调用时,都会在m_object内部进行断言 是否更喜欢使用原始指针?当然,这将导致析构函数创建删除原始指针 这种说法会在这种情况下产生一些明显的影响吗?或者那仍然可以忽略不计?

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

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

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

    这将为您返回原始指针。