在C ++中以有效的方式比较字符串的方法

时间:2010-11-10 15:06:08

标签: c++ string

将字符串与另一个字符串或字符串文字进行比较是否有效?

string a;
string b;
if (a == "test")

if (a == b)

我的同事让我使用memcmp

对此有何评论?

感谢。

8 个答案:

答案 0 :(得分:42)

是使用a == b,不要听你的同事。

你应该总是更喜欢代码可读性并使用STL而不是使用C函数,除非你的程序中有一个特定的瓶颈需要优化并且你已经证明它确实是一个瓶颈。

答案 1 :(得分:17)

显然你应该使用a == b并依赖它的实现。

对于记录,popular implementation中的std::char_traits<char>::compare()依赖于memcmp(),因此直接调用它只会更加痛苦且容易出错。

答案 2 :(得分:9)

如果你真的需要知道,你应该编写一个测试应用程序,看看时间是什么。

话虽如此,你应该依赖提供的实现非常有效。它通常是。

答案 3 :(得分:8)

我认为你的同事对可能的优化有点迷恋。

  • memcmp不是为了比较字符串(即strcmp)
  • 只能比较最短字符串的大小,你需要在两个字符串上使用strlen
  • memcmp返回&lt; 0,= 0,&gt; 0,这是一个令人讨厌的事情
  • strcmp和strlen会导致错误的c风格字符串出现奇怪的行为(不以\ 0或null结尾)

答案 4 :(得分:7)

效率低下。 std::string::operator==可以做一次非常快速的检查,等长。如果刺痛长度不相等(非常常见),它可以返回false而不查看一个角色。

在C中,memcmp必须告知要比较的长度,这意味着您需要调用strlen两次,并查看两个字符串中的所有字符。

答案 5 :(得分:3)

STL最佳实践是始终更喜欢成员函数来执行给定任务。在这种情况下,basic_string::operator==

您的同事需要在C ++中多思考一下并远离CRT。有时候我认为这只是因为对未知事物的恐惧 - 如果你可以教育C ++选项,也许你会有更轻松的时间。

答案 6 :(得分:2)

仅限速度非常重要

使用固定大小的字符串(32-64字节非常好),初始化为全零,然后填充字符串数据。 (注意,这里,“string”我指的是原始C代码或您自己的自定义字符串类,不是 std :: string类。)

使用memcpy和memcmp始终使​​用固定缓冲区大小比较这些字符串。

如果你确保你的字符串缓冲区是16字节对齐的话,你可以比memcmp更快,所以你可以使用SSE2,你只需要测试相等性而不是大于或小于。即使没有SSE2,您也可以使用字大小的块中的减法进行相等比较。

这些技术加快速度的原因是它们从等式中删除了逐字节比较测试。寻找终止'\0'或不同的字节是昂贵的,因为测试和分支很难预测和管道。

答案 7 :(得分:1)

可能或不是

如果你的C ++实现使用高度优化的memcmp(如GCC那样)和 它的C ++字符串比较做了琐碎的while(*p++ == *q++) ...等效, 然后,是的,memcmp会更快大字符串因为它一次利用多个字符比较并且对齐32位加载

在较短的字符串上,这些优化在时间中不可见 - 但是在较大的字符串(大约10K左右)上,加速应该清晰可见。

答案:它取决于 ;-)检查你的C ++字符串实现。

此致

RBO