c++ -- operator== vs string::compare() vs strcmp
阿新 • • 發佈:2019-02-03
在stack overflow上看到了這樣一個問題:為什麼string
的operator==
會這麼慢? 當然提問者的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::string
與std::wstring
做了優化,即首先比較了長度,並且使用了char_traits::compare()
替換了basic_string::compare()
,減少了一個函式呼叫,避免了basic_string::compare()
裡對長度的處理。
BTW: string::compare()
與strcmp()
不是等價的。string
會記錄長度,其中是可以包含字元'\0'
的。string::compare()
會按照string
的長度比較,不會遇到'\0'
停止。但是,strcmp()
會以'\0'
為字串的終止。