那谁的技术博客

感兴趣领域:高性能服务器编程,存储,算法,Linux内核
随笔 - 210, 文章 - 0, 评论 - 1183, 引用 - 0
数据加载中……

自己实现的memcpy

没有考虑目标和源地址可能重复的情况,不知道除了这个方法之外不用汇编等方式还有没有更快的方法?至少我目前是想不出来:)

void *my_memcpy(void *dst, void* src, int size)
{
    
int len = sizeof(long);
    
long *pdst = (long*)dst;
    
long *psrc = (long*)src;

    
for (; size >= len; ++pdst, ++psrc, size -= len)
    {   
        
*pdst = *psrc;
    }   

    
for (len = size, size = 0; size < len; ++size)
    {   
        
*((char*)pdst + size) = *((char*)psrc + size);
    }   

    
return dst;
}

int main()
{
    
char src[] = "hello", dst[10= {'\0'};

    my_memcpy(dst, src, 
5); 
    printf(
"dst = %s\n", dst);

    
return 0;
}



posted on 2009-04-18 09:30 那谁 阅读(6783) 评论(13)  编辑 收藏 引用 所属分类: C\C++算法与数据结构

评论

# re: 自己实现的memcpy  回复  更多评论   

至少是可以循环展开的。

把这个跟gcc的比较一下,估计是有不少差距的。
2009-04-18 10:17 | Davies

# re: 自己实现的memcpy  回复  更多评论   

mov edi, DEST
mov esi, SOURCE
mov ecx, COUNT
repz movsb

....
2009-04-18 13:28 | 陈梓瀚(vczh)

# re: 自己实现的memcpy  回复  更多评论   

没有考虑内存对齐。
2009-04-18 15:30 | OwnWaterloo

# re: 自己实现的memcpy  回复  更多评论   

@OwnWaterloo

=_=!!
2009-04-18 15:54 | yafare

# re: 自己实现的memcpy  回复  更多评论   

http://www.codeguru.com/forum/archive/index.php/t-294627.html
2009-04-18 16:40 | hacker47

# re: 自己实现的memcpy  回复  更多评论   

可以参考下这个:
http://www.cppblog.com/ant/archive/2007/10/12/32886.html
2009-04-18 19:08 | OwnWaterloo

# re: 自己实现的memcpy  回复  更多评论   

你这好像要靠编译器优化,并没有显示优化,不能说没有更快,
最简单拿你那个复制5个字节的例子,就没必要函数调用,可以内联展开,并且把循环忽略掉
2009-04-18 20:07 | llbird

# re: 自己实现的memcpy  回复  更多评论   

还发现一个问题……
void* my_memcpy(void *dst, /* const */ void* src, int size);
2009-04-18 20:27 | OwnWaterloo

# re: 自己实现的memcpy  回复  更多评论   

这样的写法,如果dest和src刚开始就不是对齐的,效率就会非常低下。
2009-04-18 23:59 | ClassyK

# re: 自己实现的memcpy[未登录]  回复  更多评论   

@ClassyK
你说的有道理.

2009-04-19 09:29 | 那谁

# re: 自己实现的memcpy[未登录]  回复  更多评论   

memcpy基本上是不可能快过库里面的。现在memcpy都被特殊对待了,就像关键字一样。
2009-04-19 13:25 | Megax

# re: 自己实现的memcpy  回复  更多评论   

没有考虑内存重叠
2009-09-04 09:27 | piter

# re: 自己实现的memcpy[未登录]  回复  更多评论   

要memcpy的str长度小于4呢?你不玩了?
2010-08-18 16:50 | jack

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理