免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2186 | 回复: 9
打印 上一主题 下一主题

一个有关memcpy实现的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-14 10:19 |只看该作者 |倒序浏览
OpenBSD中memcpy实现如下:

void *
memcpy(s1, s2, n)
        void *s1;
        const void *s2;
        size_t n;
{
        register const char *f = s2;
        register char *t = s1;

        if (f < t) {
                f += n;
                t += n;
                while (n-- > 0)
                        *--t = *--f;
        } else
                while (n-- > 0)
                        *t++ = *f++;
        return s1;
}

请问为什么要判断 "f < t"?
谢谢!!!

论坛徽章:
0
2 [报告]
发表于 2012-05-14 10:26 |只看该作者
本帖最后由 hbmhalley 于 2012-05-14 10:26 编辑

  1. int a[9];
  2. memcpy (a , a+1 , 8*sizeof(int)) ;
  3. memcpy (a+1 , a , 8*sizoef(int)) ;
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2012-05-14 11:15 |只看该作者
osmanthusgfy 发表于 2012-05-14 10:19
OpenBSD中memcpy实现如下:


OpenBSD用这个实现memcpy,严重怀疑, 这得多慢啊
而且用了C89之前的C函数风格

论坛徽章:
0
4 [报告]
发表于 2012-05-14 11:34 |只看该作者
本帖最后由 osmanthusgfy 于 2012-05-14 11:57 编辑

回复 3# safedead

/*
* This is designed to be small, not fast.
*/

这是他们的注释.

glibc中的实现中直接嵌入当前硬件平台的汇编了.


   

论坛徽章:
0
5 [报告]
发表于 2012-05-14 11:36 |只看该作者
回复 2# hbmhalley

大哥请明示.


   

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
6 [报告]
发表于 2012-05-14 12:42 |只看该作者
回复 2# hbmhalley


    那memmove是干嘛的?

论坛徽章:
0
7 [报告]
发表于 2012-05-14 12:45 |只看该作者
回复 6# starwing83


    这你得问楼主的openbsd

论坛徽章:
0
8 [报告]
发表于 2012-05-17 14:25 |只看该作者
回复 1# osmanthusgfy


    防止内存覆盖!

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
9 [报告]
发表于 2012-05-17 15:20 |只看该作者
starwing83 发表于 2012-05-14 12:42
回复 2# hbmhalley


似乎现在的VC中也作了判断的。
多做点也是符合标准的,只是让某些代码的移植性问题更难暴露

论坛徽章:
0
10 [报告]
发表于 2012-05-21 13:30 |只看该作者
防止Copy的目标区域与源区域有Overlap.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP