一道面试题的思考。。。

本文摘自国嵌聊天群聊记录:

国嵌唐老师(22134670)
21:04:16
下一个题是一个同学面试时遇见的,他被鄙视了,大家看看自己是否可以过关。题目如下:
在32位机器上,用你觉得最高效的方法实现 memcpy 函数。

void* memcpy(void* dest, void* src, unsigned int size);

Success(609091075)21:09:08
void* memcpy(void* dest, void* src, unsigned int size)
{
unsigned int i;
for(i=0; i<=size; i++)
{
*dest++ = *src++;
}
}
国嵌唐老师(22134670)21:09:28
大家好好考虑一下这个题 很不容写好的 因为涉及了太多的知识点
国嵌唐老师(22134670)21:09:36
你这个不对 void指针不能运算
臨淵羨汝♯(376806955)21:11:01
还要检查指针为空的情况
。。。。。
。。。。。
。。。。。
国嵌唐老师(22134670)21:31:38
好了 这个问题 我给同学们说几点 下来大家自己写一下 我会在后面把我的答案贴出来
作为一个面试官,我觉得这个问题会考察应试这 这几个方面的知识点
(1) 函数的链式调用。大家要注意返回值是void*, 那么这个void*是什么呢?其实就是要返回参数的dest,当然这个dest是已经复制好了的内存
(2) 考虑内存重叠的情况。软件中的多数难搞的bug一般都是这些考虑不足的函数造成的,因为假设不重叠时没问题,重叠时就出错,如何出错法,没人能预料。那么我们使用memcpy时, 不会每次考虑是否重叠的问题,所以这个是函数在实现时要考虑的。
(3)题目明确说明32位机上的高效那么我们就要考虑总线周期的问题。虽然是C语言的程序,但是编译后还是汇编,还是二进制。在32位机器上,int的效率是最高的,因为每个周期读取数据的时候总是32位,所以你要拷贝一个字节,那么其实还是读取了4个字节,只不过机器会去处理而已。因此我们可以每次拷贝4个字节,这样效率就提高了4倍。但是同时问题又有了,size可能不是4的整数倍,比方对于13,那么就会遗留1个字节出来,这个时候我们必须单独处理,还是读取4个字节,通过位运算符得到我们要拷贝的有效字节。

这个面试题的考点是多了点 要求应试者从硬件到软件都要有比较深的认识才能答全 
我们不可能一点都答不出来  也可能不能答全 但是在学习时应该养成细致周全的思维习惯


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值