微软的strcmp源码,简单而绝妙!请大家帮忙分析下其中的妙处!谢谢!

csuchao 2009-03-30 05:49:35
code:
--------------------------------------------------------------------------------
int __cdecl strcmp (const char *src, const char *dst)
{
int ret = 0 ;
while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
{
++src;
++dst;
}
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
-------------------------------------------------------------------------------

从下面几个方面阐述:

1.src和dst都为空串如何返回?
2.为什么要用unsigned char*强制转换?
3.可否用*src替换*dst作为while条件?
4.是否是multithread-safe?
5.能否用于multibyte-character strings的比较?
6.能否用更少行表达?
----------------------------------------------
...全文
3211 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
qxzr2005sdu 2011-05-28
  • 打赏
  • 举报
回复
mark
yxandyx 2010-09-24
  • 打赏
  • 举报
回复

C++的字符串函数,我基本上都重写了,因为它们的效率实在是太低了!
这个比较函数的效率和我写的比起来,低了一倍,奉上代码:



int StrcmpA(const char* p1,const char* p2)
{
#define RETURN_COMPARE(x,y)\
if(x>y) return 1;\
else if(x<y) return -1;\
else if(x=='\0') return 0;

RETURN_COMPARE(p1[0],p2[0]);
RETURN_COMPARE(p1[1],p2[1]);
RETURN_COMPARE(p1[2],p2[2]);
RETURN_COMPARE(p1[3],p2[3]);
#ifdef E_64
RETURN_COMPARE(p1[4],p2[4]);
RETURN_COMPARE(p1[5],p2[5]);
RETURN_COMPARE(p1[6],p2[6]);
RETURN_COMPARE(p1[7],p2[7]);
#endif

const size_t* pt1=(const size_t*)p1+1;
const size_t* pt2=(const size_t*)p2+1;
while(1)
{
if(*pt1!=*pt2)
{
//发现不相等的字符
p1=(const char*)pt1;
p2=(const char*)pt2;
RETURN_COMPARE(p1[0],p2[0]);
RETURN_COMPARE(p1[1],p2[1]);
RETURN_COMPARE(p1[2],p2[2]);
RETURN_COMPARE(p1[3],p2[3]);
#ifdef VE_64
RETURN_COMPARE(p1[4],p2[4]);
RETURN_COMPARE(p1[5],p2[5]);
RETURN_COMPARE(p1[6],p2[6]);
RETURN_COMPARE(p1[7],p2[7]);
#endif

}
else if((*pt1&0xff)==0
||
(*pt1&0xff00)==0
||
(*pt1&0xff0000)==0
||
(*pt1&0xff000000)==0
#ifdef VE_64
||
(*pt1&0xff00000000)==0
||
(*pt1&0xff0000000000)==0
||
(*pt1&0xff000000000000)==0
||
(*pt1&0xff00000000000000)==0
#endif
)
return 0;//检查结束
pt1++;
pt2++;
}
}

  • 打赏
  • 举报
回复
看了这么多我也贴一个
int strcmp(char *s,char *t)
{ while(*s&&*t&&*s==*t)
{ s++;t++
}
return *s-*t;
}
RobinTang 2010-03-14
  • 打赏
  • 举报
回复
int strcmp(const char *str1, const char *str2)
{
while(*str1 && (*str1==*str2)){
++str1;
++str2;
}
return *str1-*str2;
}
fantasyeden 2010-03-05
  • 打赏
  • 举报
回复
int strcmp (const char *cs,const char *ct)
{
signed char res;
while(1)
{
if ( ( res = *cs - *ct++) != 0 || !*cs++ )
{
break;
}
}
return res;
}
brookmill 2009-03-31
  • 打赏
  • 举报
回复
9楼的Linux版本确实很可疑,18楼分析的没错。
而且,根本没必要定义p和q,直接用src和dst就行了
csuchao 2009-03-31
  • 打赏
  • 举报
回复
而且
char *p = src;
char *q = dst;
多定义了两个指针,这不是多占用了栈的空间吗?
对于底层函数来说,这岂不是很不好!
pengzhixi 2009-03-31
  • 打赏
  • 举报
回复
做个标记
csuchao 2009-03-31
  • 打赏
  • 举报
回复
while ( *p++ == *q++ )
<=>
while ( *p == *q )
{
p++;
q++;

...
}
是这样吗?
csuchao 2009-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hitlion2008 的回复:]
这有个Linux 版本
int strcmp( const char *src, const char *dst ) {
char *p = src;
char *q = dst;
while ( *p++ == *q++ ) {
if ( *p == 0 ) {
return 0;
}
}
return *p - *q;
}
[/Quote]

其中while ( *p++ == *q++ )
这里*p++ == *q++
等价于先验证*p == *q; 然后p++; q++
假设p = "a"; q = "b";
那么由:
--------------------------------
while ( *p++ == *q++ ) {
if ( *p == 0 ) {
return 0;
}
}
--------------------------------
得:
*p = "\0";
*q = "\0"
然后
return *p - *q; 返回值为零。
这是错误的返回结果啊!
大家分析一下!
xiaocha 2009-03-30
  • 打赏
  • 举报
回复
没看出来这段代码好在哪?

1 相对“Linux 版本”(未考证)难懂

2 字符串比较算法的效率一致,很难靠写法实现优化,
主要还是靠编译器优化能力,复杂的写法反而不利于编译器优化
zhanghuayi_xiyou 2009-03-30
  • 打赏
  • 举报
回复
学习了
bo.cui 2009-03-30
  • 打赏
  • 举报
回复
linux C:
/usr/bits/string2.h

本人能力有限~读起来是在是很辛苦~~到处去找宏定义~~
你还是自己理解吧~~ 下面:


/* Compare characters of S1 and S2. */
#ifndef _HAVE_STRING_ARCH_strcmp
# if __GNUC_PREREQ (3, 2)
# define strcmp(s1, s2) \
__extension__ \
({ size_t __s1_len, __s2_len; \
(__builtin_constant_p (s1) && __builtin_constant_p (s2) \
&& (__s1_len = strlen (s1), __s2_len = strlen (s2), \
(!__string2_1bptr_p (s1) || __s1_len >= 4) \
&& (!__string2_1bptr_p (s2) || __s2_len >= 4)) \
? __builtin_strcmp (s1, s2) \
: (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
&& (__s1_len = strlen (s1), __s1_len < 4) \
? (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
? __builtin_strcmp (s1, s2) \
: __strcmp_cg (s1, s2, __s1_len)) \
: (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
&& (__s2_len = strlen (s2), __s2_len < 4) \
? (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
? __builtin_strcmp (s1, s2) \
: __strcmp_gc (s1, s2, __s2_len)) \
: __builtin_strcmp (s1, s2)))); })
# else
# define strcmp(s1, s2) \
__extension__ \
({ size_t __s1_len, __s2_len; \
(__builtin_constant_p (s1) && __builtin_constant_p (s2) \
&& (__s1_len = strlen (s1), __s2_len = strlen (s2), \
(!__string2_1bptr_p (s1) || __s1_len >= 4) \
&& (!__string2_1bptr_p (s2) || __s2_len >= 4)) \
? memcmp ((__const char *) (s1), (__const char *) (s2), \
(__s1_len < __s2_len ? __s1_len : __s2_len) + 1) \
: (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
&& (__s1_len = strlen (s1), __s1_len < 4) \
? (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
? __strcmp_cc (s1, s2, __s1_len) \
: __strcmp_cg (s1, s2, __s1_len)) \
: (__builtin_constant_p (s2) && __string2_1bptr_p (s2) \
&& (__s2_len = strlen (s2), __s2_len < 4) \
? (__builtin_constant_p (s1) && __string2_1bptr_p (s1) \
? __strcmp_cc (s1, s2, __s2_len) \
: __strcmp_gc (s1, s2, __s2_len)) \
: strcmp (s1, s2)))); })
# endif
rjianfeili 2009-03-30
  • 打赏
  • 举报
回复
学习
threeleafzerg007 2009-03-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hitlion2008 的回复:]
这有个Linux 版本
int strcmp( const char *src, const char *dst ) {
char *p = src;
char *q = dst;

while ( *p++ == *q++ ) {
if ( *p == 0 ) {
return 0;
}
}
return *p - *q;
}
[/Quote]

别糟蹋了Linux的名声

明显的 const -> 非const 的单通道问题
fx397993401 2009-03-30
  • 打赏
  • 举报
回复
学习
changhe325 2009-03-30
  • 打赏
  • 举报
回复
好码。学习了
alexhilton 2009-03-30
  • 打赏
  • 举报
回复
这有个Linux 版本
int strcmp( const char *src, const char *dst ) {
char *p = src;
char *q = dst;
while ( *p++ == *q++ ) {
if ( *p == 0 ) {
return 0;
}
}
return *p - *q;
}
fengxiquan 2009-03-30
  • 打赏
  • 举报
回复
up
fengxiquan 2009-03-30
  • 打赏
  • 举报
回复
up
加载更多回复(7)

69,393

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧