C++ 在C++;

C++ 在C++;,c++,string,C++,String,这样比较一个字符串与另一个字符串或字符串文字是否有效 string a; string b; if (a == "test") 或 我的同事让我使用memcmp 对此有何评论 谢谢。如果你真的需要知道,你应该写一个测试应用程序,看看时间是什么 也就是说,您应该相信提供的实现是相当高效的。通常是这样。是的使用a==b,不要听你同事的话 您应该始终更喜欢代码可读性和使用STL而不是使用C函数,除非您的程序中存在需要优化的特定瓶颈,并且您已经证明这确实是一个瓶颈。STL最佳实践是始终更喜欢成员函数来

这样比较一个字符串与另一个字符串或字符串文字是否有效

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

我的同事让我使用memcmp

对此有何评论


谢谢。

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


也就是说,您应该相信提供的实现是相当高效的。通常是这样。

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


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

STL最佳实践是始终更喜欢成员函数来执行给定的任务。在本例中,这是
basic\u string::operator=


你的同事需要在C++中多思考一点,远离CRT。有时我认为这是由未知的恐惧引起的——如果你可以对C++选项进行教育,也许你会有一个更轻松的时间。

显然你应该使用<代码> A==B<代码>,并依赖于它的实现。


作为记录,
std::char\u traits::compare()
在a中依赖于
memcmp()
,因此直接调用它只会更痛苦,更容易出错。

我认为您的同事对可能的优化有点着迷

  • memcmp不用于比较字符串(即strcmp)
  • 要仅比较最短字符串的大小,两个字符串上都需要strlen
  • memcmp返回0,这是一个令人讨厌的问题,需要永远记住
  • strcmp和strlen会导致错误的c样式字符串出现奇怪的行为(不以\0或null结尾)
也许是,也许不是

如果C++实现使用了高度优化的MEMCMP(如GCC已经拥有的) C++的字符串比较做平凡的<代码>(*p++= **q++)…<代码>等价, 然后,是的,memcmp在大字符串上会更快,因为它一次使用多个字符比较,并对齐32位加载

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

答案是:视情况而定;-)检查C++字符串的实现。< /P> 问候

rbo

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

使用memcpy和memcmp总是使用固定的缓冲区大小来比较这些字符串

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


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

效率较低
std::string::operator=
可以快速检查长度是否相等。如果钉尾长度不相等(非常常见),它可以返回
false
,而不查看任何字符


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

我不喜欢您的同事;-)您的同事是否也建议
memmove
而不是赋值和
malloc
而不是堆栈分配?您的同事是否批准使用
std::string
而不是
void*
?您的同事不知道自己在说什么
a==b
更容易理解和编写。他建议如何使用
memcmp
?我只能想到
memcmp(a.c_str(),b.c_str(),a.size())
创建临时
char
数组(可能发生在
a==b
中)和潜在错误的
memcmp(&a,&b,sizeof(a))
。请您的同事向您展示支持其主张的基准。
if (a == b)