100 バイトのデータを保持するポインタがあります。2バイトごとに5を追加したいと思います。
例:
1 2 3 4 5 6
となります:
1 7 3 9 5 11
これで、for ループを実行できることがわかりました。もっと簡単な方法はありますか? 2バイトごとに値を増やすmemsetのようなものは?
ありがとう
ループが最善の方法です。memset() は、メモリの連続ブロックを設定するのに効率的です。ここではあまり役に立ちません。
バイトはどの形式ですか?連結文字として?または、バイトは uint32 などのサブパーツですか?
一般に、ループはこれを行うための最良の方法です。memset を使用してパターンのようなマスクを適用できたとしても、それを作成する必要があり、同じ量の CPU サイクルが必要になります。
要素ごとに 4 バイト (uint32 など) がある場合、追加用の定義済みマスクを作成することで、CPU サイクルを半分に削減できます。ただし、注意: このようなソリューションでは、オーバーフローがチェックされません (疑似コード):
uint32* ptr = new uint32[16]; // creates 64 bytes of data
(...) fill data
for (int k=0; k < 16; ++k)
{
// Hardcored Add-Mask for Little Endian systems
ptr[k] += 0x05000500; // dereference and add mask to content
}
編集: これはリトル エンディアン システムを想定しており、C++ 擬似コードであることに注意してください。
実際には、ループ展開を使用することで高速化できますが、配列が固定サイズであることを知っておく必要があります。次に、値を繰り返し割り当てるだけで、ループのオーバーヘッドをスキップします。
array[ 1 ] += 5;
array[ 3 ] += 5;
array[ 5 ] += 5;
...
これを行うことにより、ループ内に存在するジャンプおよびテスト命令によって発生するオーバーヘッドはなくなりますが、コードの膨張で支払います。
n バイトごとに値を増やすことがサポートされている場合memset
、どのようにそれを達成すると思いますか?