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