本文摘自国嵌聊天群聊记录:
国嵌唐老师(22134670)
21:04:16
下一个题是一个同学面试时遇见的,他被鄙视了,大家看看自己是否可以过关。题目如下:
在32位机器上,用你觉得最高效的方法实现 memcpy 函数。
void* memcpy(void* dest, void* src, unsigned int size);
在32位机器上,用你觉得最高效的方法实现 memcpy 函数。
void* memcpy(void* dest, void* src, unsigned int size);
Success(609091075)21:09:08
大家好好考虑一下这个题 很不容写好的 因为涉及了太多的知识点
国嵌唐老师(22134670)21:09:36
你这个不对 void指针不能运算
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时, 不会每次考虑是否重叠的问题,所以这个是函数在实现时要考虑的。
好了 这个问题 我给同学们说几点 下来大家自己写一下 我会在后面把我的答案贴出来
作为一个面试官,我觉得这个问题会考察应试这 这几个方面的知识点
(1) 函数的链式调用。大家要注意返回值是void*, 那么这个void*是什么呢?其实就是要返回参数的dest,当然这个dest是已经复制好了的内存
(2) 考虑内存重叠的情况。软件中的多数难搞的bug一般都是这些考虑不足的函数造成的,因为假设不重叠时没问题,重叠时就出错,如何出错法,没人能预料。那么我们使用memcpy时, 不会每次考虑是否重叠的问题,所以这个是函数在实现时要考虑的。
(3)题目明确说明32位机上的高效。那么我们就要考虑总线周期的问题。虽然是C语言的程序,但是编译后还是汇编,还是二进制。在32位机器上,int的效率是最高的,因为每个周期读取数据的时候总是32位,所以你要拷贝一个字节,那么其实还是读取了4个字节,只不过机器会去处理而已。因此我们可以每次拷贝4个字节,这样效率就提高了4倍。但是同时问题又有了,size可能不是4的整数倍,比方对于13,那么就会遗留1个字节出来,这个时候我们必须单独处理,还是读取4个字节,通过位运算符得到我们要拷贝的有效字节。
这个面试题的考点是多了点 要求应试者从硬件到软件都要有比较深的认识才能答全
我们不可能一点都答不出来 也可能不能答全 但是在学习时应该养成细致周全的思维习惯
我们不可能一点都答不出来 也可能不能答全 但是在学习时应该养成细致周全的思维习惯