梁 兄

{ Unix C/C++, VC6.0/VC9.0, Java }|||| { QQ:160216918 }|||| { QQ群: 26678700 }|||| { 广东省-汕头市 }

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  57 Posts :: 5 Stories :: 385 Comments :: 0 Trackbacks

      李锦俊兄确实是个高手,能想到if(str || 0 == str[0])的写法。
       我以前还喜欢这么写,后来看了一本国外的书,不记得是不是经典的<<c program language>>, 书上说指针访问的效率要高一些,原理是:   
       char test[1024];
       指针访问:
      char * lpcSource = test;
       for(  int i = 0; i < sizeof( test ); i++ ) {
            *lpcSource++ = 0;
      }
      每一次访问是*lpcSource++ = *(lpcSource+1) = *( (char * )lpcSource + 1)。
      数组下标访问:
      for( int i = 0; i < sizeof( test ); i++) {
            test[ i ] = 0;
      }
      每一次访问是test[ i ] = *(test + i ) = *( (char * )lpcSource + i  * 1).
      数组下表访问有乘法运算,而指针访问是没有的,大家知道:加减运算天生第一,乘除法运算比加减
慢很多,懂汇编的人应该比我清楚。

      当然我也没有用gcc来生成汇编代码来细细比较了,因为对于“判断字符串是否为空”这个问题,我们

检查的是第一位,两者之间的效率差别应该很微小到不用考虑吧。

       其实,if(str || 0 == str[0])要比if ( lpcSource &&  '\0' == *lpcSource )可读性高一点,因为我们对数组一看就
明白,就算是刚学C语言的人。

       最后,有位仁兄说“if(""==str) {}不可以吗? 为何如此复杂 ”----这里不是java哦。

posted on 2007-08-30 21:46 梁-兄 阅读(1117) 评论(13)  编辑 收藏 引用 所属分类: 管理艺术

Feedback

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-08-31 02:08 lovedday
看起来像咬文嚼字了。  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-08-31 08:24 kkok
再快也是一个时钟周期, 有区别吗?  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-08-31 08:57 绝对零度
乘法可不是一个时钟周期,在X86指令里面,真正一个时钟周期的指令好像不多吧?  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-08-31 09:44 haipeng
没有必要自己优化成指针访问,大部分编译器都对此做过优化的,所以写代码的时候还是写成数组下标访问,可读性好  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-08-31 12:24 蚂蚁终结者
同意上面的,编译器基本都会优化,无需特别用指针  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-08-31 12:44 love asm
快个毛,你可以测试下你的代码时间和我的时间,对比下就小得是多少倍了!

char test[1024];
char * lpcSource = test;
__asm
{
xor eax,eax
mov edi,lpcSource
mov ecx,256 ;=1024/4
rep stosd
}
  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-08-31 15:45 nOpnOp
if(str || 0 == str[0]) 这样的写法好,可读性高
if ( lpcSource && '\0' == *lpcSource ) 写法连楼主都写错了?你这里到底是要判断什么?你要判断一个指针不空的空串?  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-08-31 16:49 SuperPlayeR
if(str || 0 == str[0])
能这样写吗?
str==NULL的不给你异常才怪了。  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-08-31 21:12 梁-兄
哈哈,if(str || 0 == str[0]) 确实会core掉,我直接copy在上一篇里李锦俊给我的回复里写的,他写错了,我也没想就copy过来,实在是粗心了:(
  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下[未登录] 2007-09-01 09:31 李锦俊
谢谢楼主与楼上们的指点。
狂汗!
写少了个叹号啊!
if(!str || 0 == *str)
还是这样好点,够简单明了啊。如果想少打些字符,就这样吧
if(!str || !*str)
足够简洁了。

不过,我还是喜欢用std::string str;
if(str.empty())
这样才叫清晰。毕竟这些效率问题不会影响太多。可读性和稳定性才是最重要的。
要是像我那样粗心大意些少了个叹号,可就得不偿失了。  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-09-05 00:33 nOpnOp
所以编写不容易出错,可读性高的代码才重要。这样代码的效率的追求其实有点左了!  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2007-09-07 13:01 wangjs
if(str || 0 == str[0])
这种写法就是错的,如果str为空指针,后面的一个判断会有异常  回复  更多评论
  

# re: 回李锦俊之效率问题----数组下标访问和指针访问的效率高下 2008-01-11 04:55 TheAnswer
hoho 这个还是要看汇编才能下定论的,可以看看我新加的文章

http://www.cppblog.com/theanswerzju/archive/2008/01/11/40940.html

  回复  更多评论
  


标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航: