21

繰り返しパターンをメモリに書き込む必要があります (例: 0x11223344)。これにより、メモリ全体が (16 進数で) 次のようになります。

1122334411223344112233441122334411223344112233441122334411223344...

memset()4バイトではなく1バイトしかかからないため、どうすればよいかわかりません。

何か案は?

4

7 に答える 7

9

OS X では、これを使用memset_pattern4( )します。他のプラットフォームにも同様の API があると思います。

バッファをループで埋める以外に、単純なポータブルソリューションを知りません(これは非常に単純です)。

于 2010-07-27T15:16:32.430 に答える
6

繰り返し O(log(N)) ごとにテンプレートとして既に埋めた領域を使用して、メモリを再帰的にコピーします。

int fillLen = ...;
int blockSize = 4; // Size of your pattern

memmove(dest, srcPattern, blockSize);
char * start = dest;
char * current = dest + blockSize;
char * end = start + fillLen;
while(current + blockSize < end) {
    memmove(current, start, blockSize);
    current += blockSize;
    blockSize *= 2;
}
// fill the rest
memmove(current, start, (int)end-current);

O(log(N)) で私が意味するのは、memmove()通常、非常に高速な、手動で最適化された特別なアセンブラー ループを使用するため、メモリを手動で埋める場合よりもランタイムがはるかに高速になるということです。

于 2010-07-27T15:28:30.423 に答える
6

効率的な方法は、ポインターを必要なバイト単位のサイズ (たとえばuint32_t4 バイト) のポインターにキャストし、整数で埋めることです。少し醜いですけどね。

char buf[256] = { 0, };
uint32_t * p = (uint32_t *) buf, i;

for (i = 0; i < sizeof(buf) / sizeof(* p); i++) {
    p[i] = 0x11223344;
}

未検証!

于 2010-07-27T16:24:39.297 に答える
5

パターンが に収まる場合はwchar_t、 を使用wmemset()した場合と同じように使用できますmemset()

于 2010-07-27T16:09:52.720 に答える
3

シーケンスをどこかに設定してから、必要な場所にコピーすることmemcpy()ができます。

于 2010-07-27T15:14:57.727 に答える
2

これを行う通常の方法は、最初の 4 バイトを手動でセットアップしてから、memcpy(ptr+4, ptr, len -4)

これにより、最初の 4 バイトが 2 番目の 4 バイトにコピーされ、次に 2 番目の 4 バイトが 3 番目のバイトにコピーされます。

これは「通常」機能しますが、CPU アーキテクチャと C ランタイム ライブラリによっては保証されないことに注意してください。

于 2010-07-27T15:17:01.743 に答える