如果你不知道緩衝區的大小,你不能沒有循環。即使你不自己編寫循環,調用像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