南昌市城市建设档案馆网站,网站做水印有没有影响,手机作图软件app,标智客logo在线设计生成器免费是一个同学面试时遇见的#xff0c;他被鄙视了#xff0c;大家看看自己是否可以过关。
题目如下#xff1a;
在32位机器上#xff0c;用你觉得最高效的方法实现memcpy函数。
void*memcpy(void*dest,void*src,unsignedintsize);
大家好好考虑一下这个题 很不容写好的 因…是一个同学面试时遇见的他被鄙视了大家看看自己是否可以过关。
题目如下
在32位机器上用你觉得最高效的方法实现memcpy函数。
void*memcpy(void*dest,void*src,unsignedintsize);
大家好好考虑一下这个题 很不容写好的 因为涉及了太多的知识点。
void* memcpy(void* dest, void* src, unsigned int size)
{
unsigned int i;
for(i0; isize; 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个字节通过位运算符得到我们要拷贝的有效字节。
这个面试题的考点是多了点 要求应试者从硬件到软件都要有比较深的认识才能答全。
我们不可能一点都答不出来 也可能不能答全 但是在学习时应该养成细致周全的思维习惯。