如果你不知道缓冲区的大小,你不能没有循环。即使你不自己编写循环,调用像strlen一样会导致循环。我也将递归计算为一个循环。
您如何知道要保留哪些字节以及将哪些设置为零?如果这些字节位于已知位置,则可以使用向量操作将某些字节清零,而不是其他字节。下面的示例零出只有偶数字节在第一个64个字节的rawData
:
__m128i zeros = _mm_setzero_si128();
uint8_t mask[] = {8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0, 8, 0};
__m128i sse_mask = _mm_load_si128(mask);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[0]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[16]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[32]);
_mm_maskmoveu_si128(zeros, sse_mask, &rawData[48]);
如果每个字节在mask
高位为1,在zeros
对应的值将被复制到rawData
。您可以使用这些掩码副本的序列快速替换某些字节而不是其他字节。生成的机器代码使用SSE操作,所以这实际上相当快。这不是必需的,但如果rawData
是16字节对齐的,则SSE操作将运行得更快。
对不起,如果你的目标是ARM。我相信NEON内部函数是相似的,但不完全相同。
'memset'会做你想要的吗? – 2012-04-27 13:11:41
感谢奥利的回应。但我无法弄清楚如何使用memset。我认为它不会做我想要的。我需要这样的东西:'setZero:rawData FromByte:0 ToByte:someByte' – Garnik 2012-04-27 14:34:35
嗯,认为'memset'将帮助...这是唯一的方法... – Garnik 2012-04-30 08:37:46