如果您不知道缓冲区的大小,那么没有循环就无法做到。即使您自己不编写循环,调用类似 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]);
如果 in 每个字节的高位mask
为 1,则 in 对应的值zeros
将被复制到rawData
. 您可以使用这些掩码副本的序列来快速替换某些字节而不是其他字节。生成的机器代码使用 SSE 操作,因此这实际上非常快。rawData
这不是必需的,但如果是 16 字节对齐,SSE 操作将运行得更快。
对不起,如果你的目标是 ARM。我相信 NEON 内在函数是相似的,但并不完全相同。