C ++ string ==和compare()之間的區別?

我剛讀了一些關於使用的建議 性能

std::string s = get_string();
std::string t = another_string();

if( !s.compare(t) ) 
{

代替 優化

if( s == t )
{

我幾乎老是使用最後一個,由於我已經習慣了它,它感受天然,更具可讀性。 我甚至不知道有一個單獨的比較功能。 更確切地說,我認爲==會調用compare()。 ui

有什麼區別? 在哪一種狀況下,一種方式應該受到另外一種方式的青睞? spa

我只考慮我須要知道字符串是否與另外一個字符串相同的狀況。 調試


#1樓

這裏沒有涉及的一件事是,它取決於咱們將字符串與c字符串,c字符串與字符串或字符串與字符串進行比較。 code

一個主要的區別是,爲了比較兩個字符串,在進行比較以前檢查大小相等,這使得==運算符比比較更快。 orm

這是我在g ++ Debian 7上看到的比較 開發

// 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())); }

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

  /**
   *  @brief  Test equivalence of string and C string.
   *  @param __lhs  String.
   *  @param __rhs  C 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 _CharT* __rhs)
    { return __lhs.compare(__rhs) == 0; }

#2樓

在內部,string :: operator ==()使用string :: compare()。 請參考: CPlusPlus - String :: Operator ==() 字符串

我寫了一個小應用程序來比較性能,顯然若是你在調試環境中編譯和運行你的代碼,String :: compare()比string :: operator ==()略快。 可是,若是您在Release環境中編譯並運行代碼,則二者都很是類似。 get

僅供參考,爲了得出這樣的結論,我進行了1,000,000次迭代。

爲了在調試環境中證實爲何string :: compare更快,我去了程序集,這裏是代碼:

DEBUG BUILD

字符串::運算符==()

if (str1 == str2)
00D42A34  lea         eax,[str2]  
00D42A37  push        eax  
00D42A38  lea         ecx,[str1]  
00D42A3B  push        ecx  
00D42A3C  call        std::operator==<char,std::char_traits<char>,std::allocator<char> > (0D23EECh)  
00D42A41  add         esp,8  
00D42A44  movzx       edx,al  
00D42A47  test        edx,edx  
00D42A49  je          Algorithm::PerformanceTest::stringComparison_usingEqualOperator1+0C4h (0D42A54h)

字符串::比較()

if (str1.compare(str2) == 0)
00D424D4  lea         eax,[str2]  
00D424D7  push        eax  
00D424D8  lea         ecx,[str1]  
00D424DB  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare (0D23582h)  
00D424E0  test        eax,eax  
00D424E2  jne         Algorithm::PerformanceTest::stringComparison_usingCompare1+0BDh (0D424EDh)

你能夠在string :: operator ==()中看到它必須執行額外的操做(添加esp,8和movzx edx,al)

發佈

字符串::運算符==()

if (str1 == str2)
008533F0  cmp         dword ptr [ebp-14h],10h  
008533F4  lea         eax,[str2]  
008533F7  push        dword ptr [ebp-18h]  
008533FA  cmovae      eax,dword ptr [str2]  
008533FE  push        eax  
008533FF  push        dword ptr [ebp-30h]  
00853402  push        ecx  
00853403  lea         ecx,[str1]  
00853406  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare (0853B80h)

字符串::比較()

if (str1.compare(str2) == 0)
    00853830  cmp         dword ptr [ebp-14h],10h  
    00853834  lea         eax,[str2]  
    00853837  push        dword ptr [ebp-18h]  
    0085383A  cmovae      eax,dword ptr [str2]  
    0085383E  push        eax  
    0085383F  push        dword ptr [ebp-30h]  
    00853842  push        ecx  
00853843  lea         ecx,[str1]  
00853846  call        std::basic_string<char,std::char_traits<char>,std::allocator<char> >::compare (0853B80h)

兩個彙編代碼都很是類似,由於編譯器執行優化。

最後,在我看來,性能提高能夠忽略不計,所以我真的會讓開發人員決定哪個是首選的,由於二者都達到了相同的結果(特別是當它是發佈版本時)。


#3樓

在Visual Studio 2012調試器中,檢查字符串時,只有如下方法正常工做:

strcmp(somestring.c_str(),"")==0

返回true。

somestring.compare("")

返回1,和

somestring==""

return:no運算符「==」匹配這些操做數。

somestring.c_str()==""

return:發生了未指定的錯誤。


#4樓

假設考慮兩個字符串s和t。
給他們一些價值。
當您使用(s == t)比較它們時,它返回一個布爾值(true或false,1或0)。
可是當使用s.compare(t)進行比較時,表達式返回一個值
(i) 0 - 若是s和t相等
(ii) <0 - 若是s中的第一個不匹配字符的值小於t的值,或者s的長度小於t的長度。
(iii) > 0 - 若是t中第一個不匹配字符的值小於s的值,或者t的長度小於s的長度。


#5樓

compare有比較子串的重載。 若是你要比較整個字符串,你應該只使用==運算符(不管是否調用compare都是可有可無的)。

相關文章
相關標籤/搜索