c++ -- operator== vs string::compare() vs strcmp

在stack overflow上看到了这样一个问题:为什么stringoperator==会这么慢? 当然提问者的benchmark程序本身有问题,在编译器优化下已经完全无法测试标题中三个函数的性能了,所以这里不去讨论这个作者得到的结果。

那么,这三个函数到底哪个会快一些呢?

其实,这三个函数最终都是要进行内存的比较的,所以实际上,效率应该是相似的。但是,如果你仅仅是想判断两个 std::string是不是相等的话,operator==可以做的更快。

原因很简单。std::string是会记录字符串长度的。如果仅比较相等关系,就像operator==做的那样,那么实际可以先比较两个std::string是不是一样长。不一样长的std::string一定不会相等,于是operator==其实在很多情况下根本不需要去比较内存!

string::compare()strcmp()就不能这样,他们要给出两个串哪一个更大的结果,所以必须进行内存比较。更何况strcmp()根本拿不到字符串长度信息。

最后,让我们来看一下stdlibc++的operator==吧:

  // operator ==
  /**
   *  @brief  Test equivalence of two strings.
   *  @param __lhs  First string.
   *  @param __rhs  Second string.
   *  @return  True if @a __lhs.compare(@a __rhs) == 0.  False otherwise.
   */
  template<typename _CharT, typename _Traits, typename _Alloc>
    inline bool
    operator==(const basic_string<_CharT, _Traits, _Alloc>& __lhs,
           const basic_string<_CharT, _Traits, _Alloc>& __rhs)
    { return __lhs.compare(__rhs) == 0; }

  template<typename _CharT>
    inline
    typename __gnu_cxx::__enable_if<__is_char<_CharT>::__value, bool>::__type
    operator==(const basic_string<_CharT>& __lhs,
           const basic_string<_CharT>& __rhs)
    { return (__lhs.size() == __rhs.size()
          && !std::char_traits<_CharT>::compare(__lhs.data(), __rhs.data(),
                            __lhs.size())); }

这里提供两个版本。对一般的basic_string,使用的标准规定的默认实现,compare()==0,但同时对std::stringstd::wstring做了优化,即首先比较了长度,并且使用了char_traits::compare()替换了basic_string::compare(),减少了一个函数调用,避免了basic_string::compare()里对长度的处理。

BTW: string::compare()strcmp()不是等价的。string会记录长度,其中是可以包含字符'\0'的。string::compare()会按照string的长度比较,不会遇到'\0'停止。但是,strcmp()会以'\0'为字符串的终止。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值