socketref,再见!高德
https://github.com/adoggie
C++博客
::
首页
::
联系
::
聚合
::
管理
246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(54)
给我留言
查看公开留言
查看私人留言
我参与的团队
随笔分类
AGG/GEOS/Cairo/SVG(3)
android
Android(2)
Asm-x86(4)
Box2D
C++/Boost/STL/Template(15)
CEGUI(3)
cocos2d
Crack(8)
Django(7)
Docker
Drupal/Zope
easyMQ(1)
EGL
embbed/arm/x86(4)
Encrept & RSA & AES(1)
firefox & mozilla(1)
Flex(6)
Games/Ogre/libClan(1)
geogebra
gevent(7)
Gps管理(7)
hp openview/snmp(2)
Ice/xmlrpc(7)
IM 系统(3)
ios
JQuery
MapGis(25)
Math(4)
Math&Lear algo
Nginx
numpy(1)
OpenGL/DirectX(2)
openmess
Openscales(3)
OpenScales(10)
OpenSource开源工程(37)
perl/python/php/lua/tcl(28)
PHP(1)
Python(1)
qpid(1)
Red5&FMS(1)
Rpc(3)
swMap(5)
TCE(3)
Tk(1)
unix/linux/solaris/sco-unix/novell(11)
WebGis(44)
WebGL(1)
WebService(10)
WebSocket
WINCE(11)
yacc/lex/compiler(2)
zeromq
视频监控(10)
随笔档案
2016年9月 (1)
2016年8月 (1)
2016年3月 (2)
2016年1月 (1)
2015年6月 (1)
2015年5月 (1)
2015年1月 (1)
2014年10月 (1)
2014年5月 (6)
2014年4月 (5)
2014年3月 (1)
2013年12月 (1)
2013年11月 (2)
2013年10月 (2)
2013年9月 (6)
2013年8月 (1)
2013年5月 (1)
2013年4月 (1)
2012年11月 (2)
2012年9月 (1)
2012年7月 (3)
2012年6月 (2)
2012年5月 (1)
2012年4月 (3)
2012年3月 (10)
2012年2月 (3)
2011年12月 (1)
2011年10月 (1)
2011年8月 (5)
2011年7月 (5)
2011年6月 (10)
2011年5月 (5)
2011年1月 (4)
2010年12月 (3)
2010年11月 (9)
2010年10月 (3)
2010年9月 (7)
2010年8月 (1)
2010年7月 (1)
2010年6月 (2)
2010年5月 (3)
2010年4月 (8)
2010年3月 (1)
2010年2月 (4)
2009年11月 (2)
2009年9月 (5)
2009年8月 (10)
2009年6月 (1)
2009年4月 (2)
2009年2月 (4)
2008年8月 (1)
2008年7月 (35)
2008年6月 (5)
2008年5月 (18)
2008年4月 (3)
2007年2月 (3)
2006年9月 (1)
2006年3月 (11)
2006年2月 (1)
2006年1月 (3)
2005年12月 (5)
2005年11月 (3)
文章分类
Django
flex&django
SMS(1)
文章档案
2010年11月 (2)
2008年5月 (1)
2005年11月 (1)
相册
ecompass
my son
self_info
高中同学
监控体系
Gis
OpenSource
gnome.org
gnu.org
sf.net
www.w3c.org
www.w3c.org
搜索
最新评论
1. re: 真是无奈,前后几年陆续投腾讯阿里若干研发岗位
@Chipset
有一定道理
--放屁阿狗
2. re: 真是无奈,前后几年陆续投腾讯阿里若干研发岗位
你把别人都秒了,别人还敢招呼你?唉,明明3你知道他说的不对,你也得点头说好。低调点,低调点...
--Chipset
3. re: 利用pyCrypto进行加密Token
111
--jiangwei
4. re: 今天去the9.com面试,一些考题,一些想法
评论内容较长,点击标题查看
--一个不知名的路人。
5. re: 有问题的c++通信代码的识别
还new,还mutex_unlock,服.
--tqt
阅读排行榜
1. 易迅商品抓取(17159)
2. Centos6.x 如何安装PyBox2D,PyGame,以及升级Python2.7 (VirtualEvn)(16659)
3. 有问题的c++通信代码的识别(16272)
4. 微信开发环境的配置部署(PHP)(16199)
5. TCE - 小型的RPC通信引擎库 介绍(14841)
评论排行榜
1. 今天去the9.com面试,一些考题,一些想法(68)
2. 读vnc代码(21)
3. 加快编译速度(20)
4. 邮件监控(16)
5. 随便写个strcmp()函数,看看大家能否有更简洁的实现(15)
随便写个strcmp()函数,看看大家能否有更简洁的实现
return true if equal
1
bool
strcmp
( char
*
d
,
char
*
s){
2
if
( d
==
s)
return
true
;
3
while
(
*
d
==*
s
&&
*
d
&&
*
s){
4
d
++
;s
++
;
5
}
6
if
(
*
d
==*
s
&&
*
d
==
0
){
7
return
true
;
8
}
9
return
false
;
10
}
posted on 2008-05-05 02:57
放屁阿狗
阅读(4027)
评论(15)
编辑
收藏
引用
所属分类:
unix/linux/solaris/sco-unix/novell
Feedback
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 07:28
herculesinchina
char tmp;
char not_equal = 1;
if((d == s) return true;
if((d == NULL) || (s == NULL)) return false;
do{
tmp = !(*s++);
not_equal = !(tmp == *d++);
}while(!(tmp - not_equal));
if(not_equal)
return false
return true
不过 最高效的实现还是嵌入汇编
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 07:30
herculesinchina
正确的程序
char tmp;
char not_equal = 1;
if((d == s) return true;
if((d == NULL) || (s == NULL)) return false;
do{
tmp = (*s++);
not_equal = !(tmp == *d++);
}while(!((!tmp) - not_equal));
if(not_equal)
return false
return true
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 08:32
不懂
楼主要求的是简洁,呵呵,一般来说都是要求快速,所以楼主这个命题就算是实现了也没什么用
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现[未登录]
2008-05-05 08:46
len
crt中strcmp()返回的是整数值,这样就可以表示小于,等于,大于.
贴段vc中crt实现吧
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 );
}
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 09:51
孤帆1
建议看看ms的源码.
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 12:00
蚂蚁终结者
作为库函数效率还是比简洁重要,建议看下VC CRT的汇编代码。
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 12:20
zhp
我也写个吧:
bool strcmp( const char* d,const char * s)
{
if( d==s) return true;
while( *d++==*s++ );
return !(*d||*s);
}
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 12:24
zhp
不追求效率还可以再去一行:
bool strcmp( const char* d,const char * s)
{
while( *d++==*s++ );
return !(*d||*s);
}
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 16:19
肥仔
要有大于0,小于0,等于0的返回值啊,怎么才true false呢?
Return Value
The return value for each of these functions indicates the lexicographic relation of string1 to string2.
Value Relationship of string1 to string2
< 0 string1 less than string2
0 string1 identical to string2
> 0 string1 greater than string2
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 19:21
vitacy
assert(d && s);
if(d==s) return true;
if(len(d) != len(s) ) return false;
while(*d && *d++ == *s++ )
return ! *d;
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 21:21
Wang Feng
int
strcmp(const char *s1, const char *s2)
{
while (*s1 == *s2)
{
if (*s1 == 0)
return 0;
++s1;
++s2;
}
return *(unsigned const char *)s1 - *(unsigned const char *)(s2);
}
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 22:00
herculesinchina
个人感觉这段VC CRT的代码效率不如我的高。
下面是对while循环体的编译反汇编结果。编译选项为:
gcc -O3
============================================
VC CRT代码循环体反汇编结果
----------------------------------------------------------
80483b4: 0f b6 13 movzbl (%ebx),%edx
80483b7: 0f b6 01 movzbl (%ecx),%eax
80483ba: 29 c2 sub %eax,%edx
80483bc: 75 21 jne 80483df <strcmp+0x3f>
80483be: 80 39 00 cmpb $0x0,(%ecx)
80483c1: 75 10 jne 80483d3 <strcmp+0x33>
80483c3: eb 1a jmp 80483df <strcmp+0x3f>
80483c5: 0f b6 41 01 movzbl 0x1(%ecx),%eax
80483c9: 83 c3 01 add $0x1,%ebx
80483cc: 83 c1 01 add $0x1,%ecx
80483cf: 84 c0 test %al,%al
80483d1: 74 0c je 80483df <strcmp+0x3f>
80483d3: 0f b6 53 01 movzbl 0x1(%ebx),%edx
80483d7: 0f b6 41 01 movzbl 0x1(%ecx),%eax
80483db: 29 c2 sub %eax,%edx
80483dd: 74 e6 je 80483c5 <strcmp+0x25>
共16条语句
=================================================
我的代码反汇编结果
--------------------------------------------------------------
80483c0: 0f b6 01 movzbl (%ecx),%eax
80483c3: 83 c1 01 add $0x1,%ecx
80483c6: 3a 03 cmp (%ebx),%al
80483c8: 0f 95 c2 setne %dl
80483cb: 83 c3 01 add $0x1,%ebx
80483ce: 84 c0 test %al,%al
80483d0: 89 d6 mov %edx,%esi
80483d2: 0f 94 c0 sete %al
80483d5: 0f be d2 movsbl %dl,%edx
80483d8: 0f b6 f8 movzbl %al,%edi
80483db: 39 d7 cmp %edx,%edi
80483dd: 74 e1 je 80483c0 <strcmp+0x20>
==================================================
从指令函数上看,循环体少了4条指令,且中间没有任何跳转指令,不会影响指令流水线执行。运行效率应该比VC CRT版本高得多。
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-05 22:32
herculesinchina
我的代码好体现在三点:
1、访存次数少(一次循环仅访存两次)
对于VC代码,虽然cache一般都会命中,访问速度肯定比访问寄存器慢些
2、循环体内无跳转指令,利于流水线操作
3、指令少。
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-07 10:27
Louix
strcmp表面上看是比较字符串,说白了就是比较两段内存,为什么只用char *呢?用int *或者__int64 *才会带来质的飞跃,对于字符串结尾0的处理参考strlen。
回复
更多评论
#
re: 随便写个strcmp()函数,看看大家能否有更简洁的实现
2008-05-08 00:27
放屁阿狗
@Louix
这位老兄说的非常有道理
回复
更多评论
刷新评论列表
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
邮件监控
好些年前写的发送mail的shell脚本
btsc 代码更新 串行数据协议传输,增加明文 CRC校验
操作Solid 数据库代码
python连接DB2
cron介绍
【Linux Kernel】 读码时写的一些笔记,毕竟写给自己看,有些乱(好好理解kernel,能更好写出高效的驱动和应用代码)
今天去the9.com面试,一些考题,一些想法
随便写个strcmp()函数,看看大家能否有更简洁的实现
tinyRpc 基于tcp/xml的rpc服务器 [dev...]
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Copyright @ 放屁阿狗
Powered by:
.Text
and
ASP.NET
Theme by:
.NET Monster