c语言中compare,C ++字符串==和compare()之间的区别?

本文探讨了在不同编译环境下,C++ string的operator==()和compare()方法性能差异。在调试模式下,compare()较快,而在发布版本中两者性能相近。通过代码剖析,揭示了编译优化如何影响指令执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在内部,string :: operator ==()使用的是string :: compare()。请参考:CPlusPlus-String :: Operator ==()

我写了一个小应用程序来比较性能,显然,如果您在调试环境中编译并运行代码,String :: compare()的运行速度比string :: operator ==()快。但是,如果您在Release环境中编译并运行代码,则两者几乎相同。

仅供参考,为了得出这样的结论,我进行了1,000,000次迭代。

为了证明为什么在调试环境中string :: compare更快,我去了程序集,下面是代码:

调试构建

字符串:: operator ==()

if (str1 == str2)

00D42A34  lea         eax,[str2]

00D42A37  push        eax

00D42A38  lea         ecx,[str1]

00D42A3B  push        ecx

00D42A3C  call        std::operator==,std::allocator > (0D23EECh)

00D42A41  add         esp,8

00D42A44  movzx       edx,al

00D42A47  test        edx,edx

00D42A49  je          Algorithm::PerformanceTest::stringComparison_usingEqualOperator1+0C4h (0D42A54h)

字符串:: compare()

if (str1.compare(str2) == 0)

00D424D4  lea         eax,[str2]

00D424D7  push        eax

00D424D8  lea         ecx,[str1]

00D424DB  call        std::basic_string,std::allocator >::compare (0D23582h)

00D424E0  test        eax,eax

00D424E2  jne         Algorithm::PerformanceTest::stringComparison_usingCompare1+0BDh (0D424EDh)

您可以看到在string :: operator ==()中,它必须执行额外的操作(添加esp,8和movzx edx,al)

发布版本

字符串:: operator ==()

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,std::allocator >::compare (0853B80h)

字符串:: compare()

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,std::allocator >::compare (0853B80h)

当编译器执行优化时,这两个汇编代码都非常相似。

最后,在我看来,性能提升是微不足道的,因此我真的将它留给开发人员来决定哪个是首选,因为两者都能达到相同的结果(尤其是在发布版本时)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值