URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 13 » 看strlen有感
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
看strlen有感
看strlen有感 - genty [2006-07-08 15:22 | 1,433 byte(s)]
 
Re: 看strlen有感 - popyzl [2006-08-01 21:41 | 29 byte(s)]
 
Re: 看strlen有感 - x_killer [2006-07-12 14:56 | 266 byte(s)]
 
没错,应该从架构/结构上进行优化 - r00t [2006-08-01 22:01 | 26 byte(s)]
 
Re: 看strlen有感 - jianliang79 [2006-07-13 12:40 | 257 byte(s)]
 
Re: 看strlen有感 - freeeman [2006-07-12 02:33 | 190 byte(s)]
 
Re: 看strlen有感 - IN_FLAMES [2006-07-12 08:40 | 31 byte(s)]
 
Re: 看strlen有感 - lonelyflyer [2006-07-11 11:36 | 40 byte(s)]
 
Re: 看strlen有感 - ferry [2006-07-08 16:34 | 105 byte(s)]
 
Re: 看strlen有感 - sixpeople [2006-07-08 16:01 | 111 byte(s)]
 
Re: 看strlen有感 - genty [2006-07-08 21:01 | 637 byte(s)]
 
Subject: 看strlen有感
Author: genty    Posted: 2006-07-08 15:22    Length: 1,433 byte(s)
[Original] [Print] [Top]
首先说明这段代码来自netbsdsrc/lib/libc/string/strlen.c,如下:
size_t
strlen(const char *str)
{
register const char *s;

for (s = str; *s; ++s)
;
return(s - str);
}

函数strlen的功能是计算一个字符串的长度。

在看这段代码的时候,我在想:为什么要这样写呢?

1. 如果是在我刚接触C语言的时候,我也许会这样写:
int strlen(char *str)
{
int len = 0;

while (*str++)
len++;

return len;
}

2. 现在,还没有看这段代码之前,我也许会这样写:
int strlen(const char* str)
{
int len = 0;

while (*str++ != '')
len++;

return len;
}

3. 看了这段代码之后,我会这样写:
size_t strlen(const char* str)
{
register const char* p = str;

while (*p != '')
p++;

return (p - str);
}

在没有看这段代码之前,我是不会想到要用register限定符的,一些文字上说,使用register未必会提高速度,现在的编译器会帮你自动优化,但是我想有总比没有好一点吧!还有就是我已经习惯使用累加了,殊不知在这里更妙的方法是减法而不是加法,使用减法一次就可以了,而不像加法那样要使用多次。我想效率就体现在这里吧!
----
**顽强进取**
[Original] [Print] [Top]
Subject: Re: 看strlen有感
Author: sixpeople    Posted: 2006-07-08 16:01    Length: 111 byte(s)
[Original] [Print] [Top]
不错 不错 可以投稿到到我们杂志

只是1的代码比2代码更简洁

是不是弄反了??
----
http://heloworld.org 针对研发人员,欢迎您的参与。
[Original] [Print] [Top]
Subject: Re: 看strlen有感
Author: ferry    Posted: 2006-07-08 16:34    Length: 105 byte(s)
[Original] [Print] [Top]
开始地址已知,每次给地址加1的过程已隐含了长度值,不用再弄一个临时变量出来,加上n次1,确实有点多此一举了。
[Original] [Print] [Top]
Subject: Re: 看strlen有感
Author: genty    Posted: 2006-07-08 21:01    Length: 637 byte(s)
[Original] [Print] [Top]
有两个原因:
1.基于程序健壮性的考虑,由于无须改变字符串的内容,最好加上const,防止误操作,故char *str改为const char* str;

2.从逻辑上说while是要判断一个条件成不成立的,*str++ != ''就是这个条件。当然while(*str++)也是有同样效果的,我也看到很多程序都是这样写,这样写绝对没有错误,因为编译器会把不为0的值认为是true,这样写的优点是很简洁,有经验的人一眼就可以看出来了。但是,*str++ != ''似乎把情况说得更明白一点,就好像这样的情况:李四说:“如果我跟张三是不一样的,那么...”,李四把“张三”的名字明确的说出来了,而不是隐含在其中。而且条件判断的时候用一个布尔型比用一个非整数似乎更规范一点。所以我选择了这样的写法!
----
**顽强进取**
[Original] [Print] [Top]
Subject: Re: 看strlen有感
Author: lonelyflyer    Posted: 2006-07-11 11:36    Length: 40 byte(s)
[Original] [Print] [Top]
x86下register没用,我以前在PPC下才会用到
----
mount -o sync,dirsync
[Original] [Print] [Top]
Subject: Re: 看strlen有感
Author: freeeman    Posted: 2006-07-12 02:33    Length: 190 byte(s)
[Original] [Print] [Top]
int strlen(const char* str)
{
int len = 0;

while (str[len]) len++ ;

return len;
}


[Original] [Print] [Top]
Subject: Re: 看strlen有感
Author: IN_FLAMES    Posted: 2006-07-12 08:40    Length: 31 byte(s)
[Original] [Print] [Top]
我认为这个代码效率没有楼主的3高
----
我是马甲
[Original] [Print] [Top]
Subject: Re: 看strlen有感
Author: x_killer    Posted: 2006-07-12 14:56    Length: 266 byte(s)
[Original] [Print] [Top]
现在,见到strcpy,strlen之类讨论,若是新人,我会归为编码优化强迫症患者,若是老人,我会归为迂腐的孔××之流。

基本上,代码的细部优化是最不值得做的部分,(除非和我以前一样进行图像编解码处理),框架结构上的精益求精和数据结构上的恰当选择更有意义100倍。
[Original] [Print] [Top]
Subject: Re: 看strlen有感
Author: jianliang79    Posted: 2006-07-13 12:40    Length: 257 byte(s)
[Original] [Print] [Top]
你说的固然有一定道理。但一段代码值不值得优化,在很大程度上要看这段代码在程序中调用的频率。像strlen这样的代码在一些处理字符串的程序中被大量调用,每秒钟可能会调用上万次,当然有必要探讨一下它的优化方法。不然为什么glibc在实现strlen这样的函数时会用汇编语言实现。
[Original] [Print] [Top]
Subject: Re: 看strlen有感
Author: popyzl    Posted: 2006-08-01 21:41    Length: 29 byte(s)
[Original] [Print] [Top]
能说明一下各种方法的优缺点吗?
[Original] [Print] [Top]
Subject: 没错,应该从架构/结构上进行优化
Author: r00t    Posted: 2006-08-01 22:01    Length: 26 byte(s)
[Original] [Print] [Top]
这种优化的成果是最显著的。
----
[Original] [Print] [Top]
« Previous thread
阿卡2006嵌入式技术沙龙通知
C/C++编程版
13
Next thread »
c语言static详解
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:04, cost 0.058197975158691 ms.