Algorithm 版 (精华区)

发信人: Lerry (life is waiting...), 信区: Algorithm
标  题: [合集]strlen在内部是怎么实现的?
发信站: 哈工大紫丁香 (2003年10月12日12:30:55 星期天), 站内信件


────────────────────────────────────────
 jijian (CC)                          于 2003年10月08日16:23:23 星期三 说道:

是顺序遍历吗?

────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 18:38:26 2003 说道:

应该是吧,去看看侯捷的STL源码剖析

────────────────────────────────────────
 pineapple (菠萝)                     于 2003年10月08日18:39:59 星期三 说道:

strlen跟STL有什么关系? 愿闻其详.

────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 19:01:30 2003 说道:

我大致上翻了一下,里面好像有这方面的实现,不太确定
你去翻翻看吧
我买了一本,没时间看:)


────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 19:05:28 2003 说道:

对了,strlen函数没理由不用顺序遍历啊,这又不是查找,不涉及到效率上的考量啊



────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 19:21:58 2003 说道:

int strlen(char* p)
{
   int cnt = 0;
   assert(p);
   while( *p++ != '\0' )
    {
      cnt++;
    }
  return cnt;
}
这样就行了吧


────────────────────────────────────────
 jijian (CC)                          于 2003年10月08日19:52:48 星期三 说道:

那还不如
int strlen(char *str)
{
   int i=0;
   while(str[i])
      i++;
   return i;
}

────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 20:02:02 2003 说道:

你那样慢一些,而且没有错误处理


────────────────────────────────────────
 pineapple (菠萝)                     于 2003年10月08日20:08:19 星期三 说道:

VC++里面的strlen是用ASM写的, 可以看源代码. 程序的算法描述类似于
int strlen (const char * str)
{
    int length = 0;
    while(*str++)
        length++;
    return(length);
}
加上 assert 似乎更严谨一些.
但是strlen跟STL几乎没有任何关系, 不要缘木求鱼!

────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 20:10:40 2003 说道:

不是缘木求鱼,我记得STL源码里面有很多库函数的实现,效率很高的
也许里面有strlen的实现


────────────────────────────────────────
 pineapple (菠萝)                     于 2003年10月08日20:16:13 星期三 说道:

肯定没有! STL只是标准库的一部分. 
因为C++的模板是Compile Time的, 所以STL的所谓"源代码"就是它本身.
但是strlen之类的函数是作为二进制库发布的, 比STL的历史长得多.

────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 20:22:05 2003 说道:

STL原码剖析里面是那些标准库函数的实现代码,她完全可以去给出那些string库函数的实
现方法,不过我不确定到底有没有
C++模板是Compole Time的,什么意思(请教),你是说是编译时确定类型的吗?

────────────────────────────────────────
 pineapple (菠萝)                     于 2003年10月08日20:33:08 星期三 说道:

ANSI对C++的标准库有国际标准, 绝对不可以在STL里面给出额外的一版strlen的实现.
再强调一次, STL不等于C++标准库, 它只是一个子集(标准库中唯一的类库)
STL原码剖析里面是那些标准库函数的实现代码,她完全可以去给出那些string库函数的实
现方法,不过我不确定到底有没有
C++模板是Compole Time的,什么意思(请教),你是说是编译时确定类型的吗?

────────────────────────────────────────
 pineapple (菠萝)                     于 2003年10月08日21:09:06 星期三 说道:

//VC 6.0 sp5 成功编译
#include <stdio.h>
template <class T>
T foo(T a, T b)
{
    Compiler Ignores Me!
    asdfnawejgo;ai;rhgrl;wahae;i;
    agjeioijagor;joawrjtoi;awrtjw;a;
}
int main(void)
{
    printf("Everything Looks Fine!\n");
    return 0;
}

────────────────────────────────────────
 ssos (存在与虚无·誓不低头)          于 2003年10月08日21:10:37 星期三 说道:

好像是没有strlen的实现吧

────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 21:30:08 2003 说道:

在我的标准C++编译通不过


────────────────────────────────────────
 hewind ( 比pineapple写的程序慢了200倍! :( 555~~)  于 2003年10月08日21:32:30 星期三 说道:

strlen是C的库函数不是stl
stl是standard template library
它是标准模板库。而strlen不是用模版的。stl里只有标准模板库的代码,没有strlen的

────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 21:34:41 2003 说道:

我刚下了一本书查了,那里面是一些泛型算法


────────────────────────────────────────
 hewind ( 比pineapple写的程序慢了200倍! :( 555~~)  于 2003年10月08日21:34:55 星期三 说道:

那很可能是你用的编译器不标准。
模板函数与类只在用到的时候才编连。而不用的时候编译器自动忽略。
因此,那段代码并没有用到foo,因此编译器忽略它是可以编译的。
你用的是什么编译器?

────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 21:48:54 2003 说道:

GCC-2.95.2 for Mingw (i386-mingw32) 
应该是最标准的


────────────────────────────────────────
 Kruglinski (天堂峡谷->随风而去.....)  于 Wed Oct  8 21:54:26 2003 说道:

我对模版知道得很少

────────────────────────────────────────
 zhangyan (When Dumb meets Dumber)    于 2003年10月09日12:37:48 星期四 说道:

int strlen(const char *str){
    int len=0;
    while(*(++str))
        ++len;
    return len;
}
是顺序遍历吗?

────────────────────────────────────────
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:1.523毫秒