1

C 4.3.2 でサイズ 100000000 の配列 (unsigned short int) と、サイズ 1000000 の他の 2 つの int 配列を初期化していました。

そのため、ループによる値の追加には時間がかかるため、配列をデフォルト値 0 で動的に初期化することにしました。

私の質問は、配列をデフォルト値で動的に初期化する方法ですか?

4

2 に答える 2

8

関数を使用して、void *calloc(size_t nmemb, size_t size);メモリを初期化できます。0

このcalloc()関数は、それぞれ size バイトの要素の配列にメモリを割り当てnmemb、割り当てられたメモリへのポインタを返します。 メモリは に設定されていzeroます。nmembまたは size が0の 場合、 または後で に正常に渡すことができる一意のポインタ値をcalloc() 返します。NULLfree()

 calloc(number of elements, sizeof(type));

または、memset()明示的に使用して、呼び出しによって割り当てられたメモリを初期化することもできmalloc()ます。

注: calloc()どちらも魔法ではありません。また、どこかでループを使用して、ガベージをすべてゼロに置き換えます。

参照: なぜmalloc()+memset()は よりも遅いのですcalloc()か?

于 2013-07-27T14:11:38.727 に答える
0

何をしても、初期化時間をなくすことはできません。あなたができる最善のことは、それを最適化しようとすることです。2つのテクニックが思い浮かびます:

  • ハードウェアを効率的に使用します。ネイティブ サイズのメモリ アクセスを使用してバッファを初期化します。たとえば、32 ビット アーキテクチャ ループを超えて、4 バイト チャンクで書き込みます。
  • ループをアンロールして、制御オーバーヘッドをなくします。

アンローリングは、おそらく最適化コンパイラによって適用されます。

初期化のオーバーヘッドを重要でないセクションに移動することもできます。たとえば、プログラムの開始時にゼロで初期化される静的変数を使用できます。または、対照的に、最初の使用まで初期化を遅らせることができます (遅延初期化)。

于 2013-07-27T14:18:32.783 に答える