我可以想到一些令人讨厌的低效方法来完成这项任务,但我想知道最好的方法是什么。
例如,我想从一个字节的第 3 位开始复制 10 个字节,然后像往常一样复制到一个指针。
有没有比一次复制一个移位字节更好的方法?
谢谢
一般的方法是尽可能高效地读取源缓冲区,并在写入目标缓冲区的过程中根据需要移动它。
您不必执行字节操作,您始终可以long
通过在开始时最多执行三个字节来使源读取与大部分操作对齐,并且类似地处理结尾,因为您不应该尝试读取超过规定的内容源缓冲区长度。
从读取的值中,您可以根据需要进行移位以获得所需的位对齐并组装完成的字节以写入目标。您还可以对写入的最宽对齐字长进行相同的优化。
如果您在源代码中挖掘广泛使用可变宽度令牌(zlib、MPEG、TIFF 和 JPEG)的压缩工具或库,您可能会发现将输入或输出缓冲区视为的示例代码一个比特流,将有一些实现想法需要考虑。
在 x86 上,您可以访问的最小单位是一个字节。但是,您一次可以访问 4 个字节并一次使用 4 个字节而不是一个字节。要获得更高的速度,您可以使用 pslldq ( SSE2 )。当然,请确保您的副本对齐以获得最佳性能。
这是我编写并开始使用的解决方案。
void RightShiftMemCopy(uchar * pSource, uchar * pDest ,ushort len,uchar shiftOffset)
{
ushort i=0;
pDest+=(len-1);
pSource+=(len-1);
for(i=len-1;i != 0 ;--i)
{
*pDest = (*(pSource - 1) << 8 | *pSource) >> shiftOffset;
--pDest;
--pSource;
}
*pDest = *pSource >> shiftOffset;
}