免费注册 查看新帖 |

Chinaunix

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

Linux红帽下memcpy的实现? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-08 14:44 |只看该作者 |倒序浏览
原来以为是直接 *dst++ = *src++ ,测试了下不是这样,测试代码如下。求这个版本下memcpy的真实实现?

平台:
Linux localhost 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
Kernel \r on an \m

code:
361
    362 void my_memcpy(char* dst, const char* src, size_t cnt)
    363 {
    364     while(cnt--)
    365     {
    366         *dst++ = *src++;
    367     }
    368 }
    369
    370 void tst_memmove(int type)
    371 {
    372     char buf1[1024];
    373     memset(buf1, 0, sizeof(buf1));
    374     char* buf2 = buf1 + 1;
    375
    376
    377     strcpy(buf1, "1234567890");
    378
    379     cout << "before operator: "  << endl<< buf1 << endl << buf2 << endl;
    380     if(type == 1)
    381     {
    382         cout << "memmove" << endl;
    383         memmove(buf2, buf1, 6);
    384     }
    385     else if(type == 2)
    386     {
    387         cout << "memcpy" << endl;
    388         memcpy(buf2, buf1, 6);
    389     }
    390     else
    391     {
    392         cout << "my_memcpy" << endl;
    393         my_memcpy(buf2, buf1, 6);
    394     }
395
    396     cout << "after operator: "  << endl<< buf1 <<  endl;
    397     cout << "============== "  << endl;
    398 }
    399
    400 ///////////////////////////////////////////////////////////////
    401 // main function
    402 ///////////////////////////////////////////////////////////////
    403 typedef xxf::hashmap<int, int> XxfMap;
    404 int main()
    405 {
    406     tst_memmove(1);
    407     tst_memmove(2);
    408     tst_memmove(3);
    409
    410     return 0;
    411 }
    412

============out put============================
before operator:
1234567890
234567890
memmove
after operator:
1123456890
==============
before operator:
1234567890
234567890
memcpy
after operator:
1123446890
==============
before operator:
1234567890
234567890
my_memcpy
after operator:
1111111890
==============

论坛徽章:
0
2 [报告]
发表于 2011-10-08 23:57 |只看该作者
typedef struct BYTE_0
{
        char a ;
}
Byte_0 ;

typedef struct BYTE_1
{
        char a[10] ;
}
Byte_1 ;

typedef struct BYTE_2
{
        char a[100] ;
}
Byte_2 ;

typedef struct BYTE_3
{
        char a[1000] ;
}
Byte_3 ;

typedef struct BYTE_4
{
        char a[10000] ;
}
Byte_4 ;

typedef struct BYTE_5
{
        char a[100000] ;
}
Byte_5 ;

typedef struct BYTE_6
{
        char a[1000000] ;
}
Byte_6 ;

typedef struct BYTE_7
{
        char a[10000000] ;
}
Byte_7 ;

typedef struct BYTE_8
{
        char a[100000000] ;
}
Byte_8 ;

typedef struct BYTE_9
{
        char a[1000000000] ;
}
Byte_9 ;


void
copy_0( void **dtp, void **src )
{
        **(Byte_0 **)dtp = **(Byte_0 **)src ;
        *(Byte_0 **)dtp += 1 ;
        *(Byte_0 **)src += 1 ;
}

void
copy_1( void **dtp, void **src )
{
        **(Byte_1 **)dtp = **(Byte_1 **)src ;
        *(Byte_1 **)dtp += 1 ;
        *(Byte_1 **)src += 1 ;
}

void
copy_2( void **dtp, void **src )
{
        **(Byte_2 **)dtp = **(Byte_2 **)src ;
        *(Byte_2 **)dtp += 1 ;
        *(Byte_2 **)src += 1 ;
}

void
copy_3( void **dtp, void **src )
{
        **(Byte_3 **)dtp = **(Byte_3 **)src ;
        *(Byte_3 **)dtp += 1 ;
        *(Byte_3 **)src += 1 ;
}

void
copy_4( void **dtp, void **src )
{
        **(Byte_4 **)dtp = **(Byte_4 **)src ;
        *(Byte_4 **)dtp += 1 ;
        *(Byte_4 **)src += 1 ;
}

void
copy_5( void **dtp, void **src )
{
        **(Byte_5 **)dtp = **(Byte_5 **)src ;
        *(Byte_5 **)dtp += 1 ;
        *(Byte_5 **)src += 1 ;
}

void
copy_6( void **dtp, void **src )
{
        **(Byte_6 **)dtp = **(Byte_6 **)src ;
        *(Byte_6 **)dtp += 1 ;
        *(Byte_6 **)src += 1 ;
}

void
copy_7( void **dtp, void **src )
{
        **(Byte_7 **)dtp = **(Byte_7 **)src ;
        *(Byte_7 **)dtp += 1 ;
        *(Byte_7 **)src += 1 ;
}

void
copy_8( void **dtp, void **src )
{
        **(Byte_8 **)dtp = **(Byte_8 **)src ;
        *(Byte_8 **)dtp += 1 ;
        *(Byte_8 **)src += 1 ;
}

void
copy_9( void **dtp, void **src )
{
        **(Byte_9 **)dtp = **(Byte_9 **)src ;
        *(Byte_9 **)dtp += 1 ;
        *(Byte_9 **)src += 1 ;
}


void
depart_number( int *dtp, int size )
{
        int i ;
       
        for( i = 0 ; i < 10 ; i++ )
        {
                if( i == 9 )
                        dtp[i] = size ;
                else
                {
                        dtp[i] = size % 10 ;
                        size /= 10 ;
                }
        }
}

void
mem_copy( void *dtp, void *src , size_t size )
{
        void *tmp_dtp = dtp ;
        void *tmp_src = src ;
        int i ;
        int j ;
        void (*copy_fun[10])( void **dtp, void **src ) = {copy_0, copy_1, copy_2, copy_3, copy_4, copy_5, copy_6, copy_7, copy_8, copy_9 } ;
       
        int size_val[10] ;
       
        depart_number( size_val, size ) ;

        for( i = 0 ; i < 10 ; i++ )
        {
                for( j = 0 ; j < size_val[i] ; j++ )
                {
                        copy_fun[i]( (void *)&tmp_dtp, (void *)&tmp_src ) ;
                }
        }
}

论坛徽章:
0
3 [报告]
发表于 2011-10-09 13:06 |只看该作者
本帖最后由 x5miao 于 2011-10-09 13:10 编辑

memcpy()的实现和使用的库有关,和操作系统有什么必然关系吗?你要看memcpy()的实现直接看glibc的源码就好了啊.

并且你对memcpy()的调用也是非法的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP