1. 程式人生 > >c++ -- operator== vs string::compare() vs strcmp

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'為字串的終止。