c - 不完全理解 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];
}
我了解该函数的整个前提,但我不太了解源地址和目标地址之间按位或的原因。所以我的问题总和如下:
- 为什么 'count' 会在同一个按位算术中使用?
- 如果结果不同,为什么要检查结果的最后两位?
- 整个检查的目的是什么?
我确信这是显而易见的,但请原谅我的无知,因为在编程方面我还没有真正深入研究更底层的事情。我只是觉得它很有趣,并想了解更多。
解决方案
它正在找出源指针和目标指针是否int
对齐,以及是否count
是精确int
的字节大小。
如果这三件事都是真的,那么它们的 ls 2 位都将是0
(假设指针和int
是 4 个字节)。因此该算法对三个值进行 OR 运算,并隔离 ls 2 位。
int
在这种情况下,它通过复制int
。否则它会复制char
.char
如果测试失败,更复杂的算法将复制一些前导字节和尾随字节char
以及char
中间字节int
。int