c++ - 实现自己的 memcpy(大小以字节为单位?)

标签 c++ c

我最近有一个面试问题,我必须实现 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/

相关文章:

c++ - 进一步理解portaudio信号的fftw处理

c++ - 使用 mpz_powm 计算功率模数

c++ - 我们可以通过哪些不同的方式动态链接 DLL

c++ - C++中涉及多继承和复合类的解决设计

c++ - 如何使用 Mingw 或 Cygwin 编译和构建一个非常简单的 Gnu linux 应用程序到 Windows?

c++ - 为什么不鼓励静态链接 glibc?

c++ - 在 Mac OS 上使用 GCC 为 MS-DOS (DOSBox) 编译 C 程序

c - Win API,如何在对话框中写入文本?

c++ - 是否有任何 qt 信号用于 sql 数据库更改?

将 unsigned char 与负数进行比较