2

100 バイトのデータを保持するポインタがあります。2バイトごとに5を追加したいと思います。

例:

1 2 3 4 5 6

となります:

1 7 3 9 5 11

これで、for ループを実行できることがわかりました。もっと簡単な方法はありますか? 2バイトごとに値を増やすmemsetのようなものは?

ありがとう

4

4 に答える 4

2

ループが最善の方法です。memset() は、メモリの連続ブロックを設定するのに効率的です。ここではあまり役に立ちません。

于 2010-12-21T23:51:16.420 に答える
2

バイトはどの形式ですか?連結文字として?または、バイトは 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++ 擬似コードであることに注意してください。

于 2010-12-21T23:53:41.010 に答える
0

実際には、ループ展開を使用することで高速化できますが、配列が固定サイズであることを知っておく必要があります。次に、値を繰り返し割り当てるだけで、ループのオーバーヘッドをスキップします。

array[ 1 ] += 5;
array[ 3 ] += 5;
array[ 5 ] += 5;
...

これを行うことにより、ループ内に存在するジャンプおよびテスト命令によって発生するオーバーヘッドはなくなりますが、コードの膨張で支払います。

于 2010-12-22T00:13:05.790 に答える
0

n バイトごとに値を増やすことがサポートされている場合memset、どのようにそれを達成すると思いますか?

于 2010-12-21T23:49:57.720 に答える