Chinaunix首页 | 论坛 | 博客
  • 博客访问: 685876
  • 博文数量: 130
  • 博客积分: 2192
  • 博客等级: 大尉
  • 技术积分: 1410
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-31 15:37
文章分类

全部博文(130)

文章存档

2013年(1)

2012年(4)

2011年(27)

2010年(97)

2009年(1)

分类: 嵌入式

2010-09-04 21:48:32

今天面试碰到一道题,大致意思是: memcpy的原型是void *my_memcpy(void *dst, void* src, int size) ,请分别用 8位,16位,32位分别实现。

8位当然很简单了。然后也想到了这个参数 dst,src的指针返回时是原值,所以里面要用一个临时指针去算。 16和32 的时候,最后 余下来的部分还是要 按 8位来拷贝的,但是 这样的话16和32位又是一样的了,但又想不出来。后来路上想起来 ,那个返回值自己忘记了。

回到家,网上查了下这个实现,发现其实这是一个效率的问题。三种实现那种效率好呢?可能你会说当然是 32位。原因是:
考虑的角度是充分利用 cpu 的 32 位带宽。一次复制 1 个字节和一次复制 4 个字节占用的 cpu 指令周期是一样的,既然我们的 cpu 能同时操作 32 位,为什么我们不能一次复制 4 个字节呢?如此一来,总运行的指令数将降低到原来的 1/4 !

但一定是这样吗?不一定。如果上面的src ,dst不是4字节对齐呢?分析如下:

在地址按4 字节对齐的时候,上述算法的效率比单字节 memcpy 实现高很多,但如果地址没有按4 字节对齐,则其效率并不高,有时甚至还比普通 memcpy 还低。这可能是因为,虽然上述算法减少了 cpu 的指令数,但内存的速度比 cpu 慢得多,速度的瓶颈还是在内存。(http://www.cnblogs.com/shapherd/archive/2010/05/19/1739628.html)

还看到了老外对这个问题的探讨
阅读(4683) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

kangear2013-05-13 21:34:49

今天笔试就出的这个题目,32 高效 memcpy,不过我不是char型拷贝,主管最后说了我一下。

kangear2013-05-13 21:34:47

今天笔试就出的这个题目,32 高效 memcpy,不过我不是char型拷贝,主管最后说了我一下。