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)