16

私は興味を持ってmallocとcallocのポストCの違いを読みました。コードでmallocを使用していますが、代わりにcallocを使用するとどのような違いがあるのか​​知りたいです。

mallocを使用した現在の(擬似)コード:

シナリオ1

int main()
{  
   allocate large arrays with malloc

   INITIALIZE ALL ARRAY ELEMENTS TO ZERO

   for loop //say 1000 times
    do something and write results to arrays
   end for loop

   FREE ARRAYS with free command

} //end main

mallocの代わりにcallocを使用すると、次のようになります。

シナリオ2

int main()
{  

   for loop //say 1000 times
    ALLOCATION OF ARRAYS WITH CALLOC 

    do something and write results to arrays

    FREE ARRAYS with free command

   end for loop


} //end main

私は3つの質問があります:

  1. アレイが非常に大きい場合、どのシナリオがより効率的ですか?

  2. アレイが非常に大きい場合、どのシナリオがより時間効率が高くなりますか?

  3. どちらのシナリオでも、forループの任意の反復について、最初の要素から最後の要素まで順番に各配列を書き込んでいるという意味で、配列に書き込んでいます。重要な質問:シナリオ1のようにmallocを使用している場合、要素をゼロに初期化する必要がありますか?mallocで、配列z = [garbage1、garbage2、garbage3]があるとします。反復ごとに、要素を順番に書き込んでいます。つまり、最初の反復ではz = [some_result、garbage2、garbage3]を取得し、2番目の反復では最初の反復でz = [some_result、another_result、garbage3]を取得します。オンの場合、mallocの後にアレイを特に初期化する必要がありますか?

4

7 に答える 7

16

2つの例で初期化されるメモリの合計量が同じであると仮定すると、メモリの割り当ては、メモリを割り当ててから別のステップでゼロにするcalloc()よりも高速である可能性があります。特に、反復によって要素を個別にゼロにする場合はそうです。ループでそれらの上に。に続くaは、おそらく。と同じくらいの速さです。malloc()malloc()malloc()memset()calloc()

計算結果を実際に格納する前に配列要素がガベージであることを気にしない場合は、の後に実際に配列を初期化する必要はありませんmalloc()

于 2010-04-09T06:31:48.207 に答える
1

1と2の場合、どちらも同じことを行います。つまり、割り当てとゼロを実行してから、配列を使用します。

3の場合、最初に配列をゼロ化する必要がない場合は、ゼロ化は不要であり、ゼロ化を行わない方が高速です。

callocのゼロ化は、作成したコードよりも効率的である可能性がありますが、この違いは、プログラムが実行する他の作業と比較してわずかです。callocの本当の節約は、そのコードを自分で書く必要がないことです。

于 2010-04-09T06:31:24.573 に答える
0

3.で述べたあなたのポイントは、ケースまたは不必要な初期化を示しているようです。それは速度的にはかなり悪いです、それをするのに費やされた時間が無駄になるだけでなく、それのためにたくさんのキャッシュの排除が起こりました。

memset()または(とにかくbzero()呼び出されるcalloc())を実行することは、キャッシュの大部分を無効にするための良い方法です。すべてを上書きしないことが確実で、まだ書き込まれていないバッファの部分を読み取ることができる場合を除いて、これを行わないでください(0が許容可能なデフォルト値であるかのように)。とにかくすべてを上書きする場合は、どうしてもメモリを不必要に初期化しないでください。

不必要なメモリ書き込みは、アプリのパフォーマンスを損なうだけでなく、同じCPUをアプリと共有するすべてのアプリケーションのパフォーマンスも損ないます。

于 2010-04-09T17:50:25.357 に答える
0

callocとアプローチはmemsetほぼ同じで、自分でゼロにするよりも少し速いかもしれません。

とにかく、それはすべてメインループ内で行うことに関連しており、桁違いに大きくなる可能性があります。

于 2010-04-09T11:38:33.127 に答える
0

mallocは、オペレーティングシステムからのメモリをそのまま返すため、Callocよりも高速です。ただし、Callocを呼び出すと、カーネルまたはオペレーティングシステムからメモリが取得され、ゼロで初期化されてから返されます。そのため、初期化には時間がかかります。そのため、mallocはCallocよりも高速です

于 2018-05-31T09:26:35.207 に答える
0

Linuxについてはわかりません。しかし、Windowsにはゼロページスレッドと呼ばれるものがあります...callocはすでにゼロに初期化されているページを使用します。mallocとcallocの速度に違いはありません。

于 2020-05-26T10:09:09.397 に答える
-7

malloccalloc2つの理由で異なる

  1. mallocは1つの引数を取りますが、callocは2つの引数を取ります

  2. mallocはcallocよりも高速です。これは、mallocが1次元配列をポインター形式に処理するのに対し、callocは2次元配列を取得し、処理される前に1次元配列に変換してからポインター形式に変換するためです。

そういうわけで、callocと比較してmalloc処理が高速です

于 2013-03-13T08:11:23.903 に答える