Algorithm 版 (精华区)
发信人: Lerry (life is waiting...), 信区: Algorithm
标 题: [合集]strlen在内部是怎么实现的?
发信站: 哈工大紫丁香 (2003年11月27日18:27:32 星期四), 站内信件
────────────────────────────────────────
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)
页面执行时间:2.298毫秒