一个strcpy

shiweifu 2012-04-24 11:17:21
94年的glibc里面的strcpy

/* Copy SRC to DEST. */
char *
DEFUN(strcpy, (dest, src), char *dest AND CONST char *src)
{
reg_char c;
char *s = (char *) src;
CONST ptrdiff_t off = dest - src - 1;

do
{
c = *s++;
s[off] = c;
}
while (c != '\0');

return dest;
}




为啥会想到拿负数当下标进行计算?和当时的硬件有关系?
...全文
210 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
玩笑 2012-04-26
  • 打赏
  • 举报
回复
用一个地址计算比用两个地址计算更快吧,或者,这代码会被编译器优化成把s直接存放到寄存器中,如果再增加一个地址,就要使用到内存??你反汇编看看,它是不是在整个计算地址的过程中只用到了寄存器,如果是的话,那应该就是一个地址效率更高的原因,所以才这样写,至于具体原因,不详,呵呵,但个人认为,库函数这东西,多半是追求效率的,只要能提高效率,哪怕再纠结的写法,也会用的
shiweifu 2012-04-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

用一个地址计算比用两个地址计算更快吧,或者,这代码会被编译器优化成把s直接存放到寄存器中,如果再增加一个地址,就要使用到内存??你反汇编看看,它是不是在整个计算地址的过程中只用到了寄存器,如果是的话,那应该就是一个地址效率更高的原因,所以才这样写,至于具体原因,不详,呵呵,但个人认为,库函数这东西,多半是追求效率的,只要能提高效率,哪怕再纠结的写法,也会用的
[/Quote]

嗯,应该是这样的。我一会儿返汇编看看,先忙别的去了
结贴,分都给你吧
qiang81020 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

不好意思,是我理解错你意思了,我是说在不同程序中off的值不同,在函数执行过程中确实是固定的。
[/Quote]

off没动,s在动。。。。感觉跟我们的常规思路不同。。。
shiweifu 2012-04-25
  • 打赏
  • 举报
回复
不好意思,是我理解错你意思了,我是说在不同程序中off的值不同,在函数执行过程中确实是固定的。
evencoming 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:

off固定的值..
神奇的写法..


我调试了下,off不是固定的值,应该是两个变量在的内存地址的差。
[/Quote]
恕我愚昧,只看到了一个对 off的初始化,会不固定吗?
shiweifu 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

off固定的值..
神奇的写法..
[/Quote]

我调试了下,off不是固定的值,应该是两个变量在的内存地址的差。
evencoming 2012-04-25
  • 打赏
  • 举报
回复
off固定的值..
神奇的写法..
shiweifu 2012-04-24
  • 打赏
  • 举报
回复
为啥当时会这么写?和系统或硬件有关系?

对照了新版glibc中的strcpy,已经成为“标准”版了。

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧