2

整数配列を特定の値に初期化する最速の方法は何ですか?

char 配列がある場合は、memset を使用できます。

char a[N];
memset( a, value, N );

配列の型が != char で、値が != 0 または -1 の場合、memset を実行できません。

int a[N];
memset( a, value, N*sizeof(int) ); // INCORRECT!

したがって、他の配列タイプに対して同様のメモリ初期化を行う方法があるかどうか疑問に思います。

4

4 に答える 4

7

使用std::fill:

char a[N];
std::fill(std::begin(a), std::end(a), value);

std::beginstd::endは C++11 で定義されていることに注意してください。

C++03 を使用している場合、これは機能します。

char a[N];
std::fill(a, a + N, value);
于 2013-10-25T12:37:56.953 に答える
1

集約の初期化よりも速い方法はありません。

int x = {1,2,3,4,5,6};

すべてをゼロに初期化する場合は、構文を利用して配列全体を値で初期化できます。

int x [50] = {};

これは次のものとは異なります。

int x[50];

初期化子を指定すると、初期化されていない要素が値で初期化されるためです。初期化子を指定しない場合、要素は初期化されません。

より速いメソッドがあり得ないからといっint x[] = {....}て、他のメソッドが遅いとは限りません。確実に知るには、実際のプラットフォームでリリース モードでプロファイリングする必要があります。

于 2013-10-25T12:51:30.753 に答える
0

任意のプリミティブ型で memset を使用できると思います。

int a[N] 
memset(a, '0x00', N * sizeof (int))
于 2013-10-25T12:36:34.757 に答える
0

あらゆる種類のオブジェクト/プリミティブを memset できます。結局のところ、すべてがメモリに保存されます。

つまり、何が得られるかを予測するために、コンパイラとプロセッサがmemset'ingしているものをどのように保存するかを理解する必要があります。移植性が非常に低く、間違った場合は危険です。

最新のデスクトップ プロセッサのパフォーマンスの多くは、参照しているオブジェクトがキャッシュにあるかどうかによって異なります。そのため、速くなるかどうかを言うのは難しいです。他のすべての条件が同じであれば、より高速になる可能性があります。

于 2013-10-25T12:56:38.330 に答える