首页 > 解决方案 > 不完全理解 C 中自定义编写的“memcpy”函数

问题描述

所以我今天早些时候浏览了 Quake 引擎的源代码,偶然发现了一些编写的实用函数。其中之一是“Q_memcpy”:

void Q_memcpy (void *dest, void *src, int count)
{
    int             i;

    if (( ( (long)dest | (long)src | count) & 3) == 0 )
    {
        count>>=2;
        for (i=0 ; i<count ; i++)
            ((int *)dest)[i] = ((int *)src)[i];
    }
    else
        for (i=0 ; i<count ; i++)
            ((byte *)dest)[i] = ((byte *)src)[i];
}

我了解该函数的整个前提,但我不太了解源地址和目标地址之间按位或的原因。所以我的问题总和如下:

我确信这是显而易见的,但请原谅我的无知,因为在编程方面我还没有真正深入研究更底层的事情。我只是觉得它很有趣,并想了解更多。

标签: cutility-method

解决方案


它正在找出源指针和目标指针是否int对齐,以及是否count是精确int的字节大小。

如果这三件事都是真的,那么它们的 ls 2 位都将是0(假设指针和int是 4 个字节)。因此该算法对三个值进行 OR 运算,并隔离 ls 2 位。

int在这种情况下,它通过复制int。否则它会复制char.char

如果测试失败,更复杂的算法将复制一些前导字节和尾随字节char以及char中间字节intint


推荐阅读