c++ -- operator== vs string::compare() vs strcmp
来源:互联网 发布:c语言中sleep函数 编辑:程序博客网 时间:2024/06/06 01:07
在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'
为字符串的终止。
- c++ -- operator== vs string::compare() vs strcmp
- C++基础---string类的operator==/operator!=/operator</operator<=/operator>/operator>=/compare
- VC++ 到vs 2010时error C2593: “operator =”不明确
- Shell && vs || operator
- JavaScript 进阶(五)易混淆概念null vs undefined, == vs ===, string vs String
- Python ** operator vs math.pow
- TextBox.Text += “string”; vs TextBox.AppendText(“string”);
- String VS StringBuffer VS StringBuilder
- C# string vs String
- 【c#】VS
- string+vs String.format ,append vs AppendFormat
- <string>VS<string.h>VS<cstring>
- Stirng.IsNullOrEmpty() VS string.length==0
- Compare the function: SQL server vs ORACLE
- bash vs perl vs c
- Java getClass() VS instanceof VS ==
- operator new" vs. "new operator" 关系与区别
- python bitwise and or operator VS logical operator
- 8086指令系统
- 引用外部.css或.js文件的路径问题
- 代码模板codetemplates.xml
- 利用Qemu Guest Agent (Qemu-ga) 实现 Openstack 监控平台
- continue、break、return这三个关键字的区别
- c++ -- operator== vs string::compare() vs strcmp
- python问题:IndentationError:expected an indented block错误解决
- Mac 下Versions的 svn无法上传 .a 文件的问题
- 模式识别的一些基本概念
- Android Touch事件传递机制
- 最简单解决CHM文件无法显示的办法
- The Triangle
- 字符串赋值,查找,交换
- rpm命令详解