バッファのサイズがわからない場合は、ループなしで行うことはできません。あなた自身でループを記述しなくても、strlenのようなものを呼び出すとループが発生します。ここでもループとして再帰をカウントしています。
保持するバイトとゼロに設定するバイトをどのように知っていますか?これらのバイトが既知の位置にある場合、ベクトル演算を使用してバイトの一部をゼロにし、他のバイトをゼロにすることができます。以下の例は、rawData
の最初の64バイトを超えるだけでもバイトをゼロに:
__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
の各バイトの上位ビットがzeros
に対応する値をrawData
にコピーされ、1の場合。これらのマスクされたコピーのシーケンスを使用して、いくつかのバイトを素早く置き換えることができます。結果のマシンコードはSSE操作を使用するため、実際は非常に高速です。これは必須ではありませんが、rawData
が16バイト境界である場合、SSE操作は非常に高速に実行されます。
ARMをターゲットにしている場合は申し訳ありません。 NEONの組み込み関数は似ていますが、同一ではないと思います。
'memset'はあなたが望むことをしますか? –
お返事ありがとうございました。しかし、私は 'memset'の使い方を理解できませんでした。そして私はそれが私が望むことをしないと思う。 'setZero:rawData FromByte:0 ToByte:someByte' – Garnik
' memset'が助けになると思う...これは唯一の方法です... – Garnik