我最近有一个面试问题,我必须实现 memcpy。根据我的经验,我已经大量使用了 memcpy,所以它看起来并不是一个棘手的问题。
所以,我开始实现一个循环,一次从一个指针复制一个地址到另一个指针,就像这样:
void memcpy(void* dest, void* src, int size){
for(int index = 0; index < size; index++){
dest[index] = src[index];
}
}
然而,面试官打断了我,注意到 memcpy 的手册页说它“将 n 个字节从 src 复制到 dest”(我后来证实了这一点),然后希望我按 size/4 迭代,然后用另一个获取剩余的字节index < size%4 的循环(我想假设它是一个 32 位系统?)
好吧,这看起来很奇怪,因为我已经使用 memcpy 多年没有问题,而不必给它一个 *4 修饰符)。当我回到家时,我启动了 gdb 并复制了一个小字符串“hello”,并小心地使用 strlen() 和常量输入大小以查看它的开始和停止位置。
char* src = "hello";
char* dest = calloc(16, sizeof(char));
int len = strlen(src);
memcpy(dest, src, len); // both my version and official version
现在我用 gdb 仔细检查了 src 和 dest,它们都包含“hello\0”。
所以我的问题是:对于使用数字 4(或“以字节为单位的大小”),我有什么不理解的地方?为什么文档说的是“n 字节”,而这并不是真正的行为?我在这里看不清楚什么?
最佳答案
正如其他人所说,一次复制 4 个字节比一次复制 1 个字节要快。面试官希望你做这样的事情:
void memcpy(void* dest, void* src, int size)
{
uint8_t *pdest = (uint8_t*) dest;
uint8_t *psrc = (uint8_t*) src;
int loops = (size / sizeof(uint32_t));
for(int index = 0; index < loops; ++index)
{
*((uint32_t*)pdest) = *((uint32_t*)psrc);
pdest += sizeof(uint32_t);
psrc += sizeof(uint32_t);
}
loops = (size % sizeof(uint32_t));
for (int index = 0; index < loops; ++index)
{
*pdest = *psrc;
++pdest;
++psrc;
}
}
关于c++ - 实现自己的 memcpy(大小以字节为单位?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11876361/