繰り返しパターンをメモリに書き込む必要があります (例: 0x11223344
)。これにより、メモリ全体が (16 進数で) 次のようになります。
1122334411223344112233441122334411223344112233441122334411223344...
memset()
4バイトではなく1バイトしかかからないため、どうすればよいかわかりません。
何か案は?
繰り返しパターンをメモリに書き込む必要があります (例: 0x11223344
)。これにより、メモリ全体が (16 進数で) 次のようになります。
1122334411223344112233441122334411223344112233441122334411223344...
memset()
4バイトではなく1バイトしかかからないため、どうすればよいかわかりません。
何か案は?
OS X では、これを使用memset_pattern4( )
します。他のプラットフォームにも同様の API があると思います。
バッファをループで埋める以外に、単純なポータブルソリューションを知りません(これは非常に単純です)。
繰り返し 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()
通常、非常に高速な、手動で最適化された特別なアセンブラー ループを使用するため、メモリを手動で埋める場合よりもランタイムがはるかに高速になるということです。
効率的な方法は、ポインターを必要なバイト単位のサイズ (たとえばuint32_t
4 バイト) のポインターにキャストし、整数で埋めることです。少し醜いですけどね。
char buf[256] = { 0, };
uint32_t * p = (uint32_t *) buf, i;
for (i = 0; i < sizeof(buf) / sizeof(* p); i++) {
p[i] = 0x11223344;
}
未検証!
パターンが に収まる場合はwchar_t
、 を使用wmemset()
した場合と同じように使用できますmemset()
。
シーケンスをどこかに設定してから、必要な場所にコピーすることmemcpy()
ができます。
これを行う通常の方法は、最初の 4 バイトを手動でセットアップしてから、memcpy(ptr+4, ptr, len -4)
これにより、最初の 4 バイトが 2 番目の 4 バイトにコピーされ、次に 2 番目の 4 バイトが 3 番目のバイトにコピーされます。
これは「通常」機能しますが、CPU アーキテクチャと C ランタイム ライブラリによっては保証されないことに注意してください。