mallocとcallocの違いは?質問する

mallocとcallocの違いは?質問する

以下の違いは何ですか?

ptr = malloc(MAXELEMS * sizeof(char *));

そして:

ptr = calloc(MAXELEMS, sizeof(char*));

callocどのような場合にover を使用するのが適切でしょうかmalloc、またその逆は適切でしょうか?

ベストアンサー1

calloc()はゼロ初期化されたバッファを提供しますが、malloc()はメモリを初期化しないままにします。

大規模な割り当ての場合、calloc主流の OS でのほとんどの実装では、既知のゼロ ページを OS から取得します (例: POSIXmmap(MAP_ANONYMOUS)または Windows経由VirtualAlloc)。そのため、ユーザー空間に書き込む必要はありません。通常、これはmallocOS からより多くのページを取得する方法であり、callocOS の保証を利用しているだけです。

これは、callocメモリが「クリーン」かつ遅延割り当てされ、システム全体で共有されるゼロの物理ページにコピーオンライトでマップされることを意味します。(仮想メモリを備えたシステムを想定)。効果は次のように確認できます。Linux でのパフォーマンス実験、 例えば。

一部のコンパイラでは、malloc + memset(0) を calloc に最適化することもできますが、メモリをゼロにしたい場合は、ソースで calloc を使用するのが最善です。(または、後でページ フォールトを回避するために事前にフォールトしようとしていた場合、その最適化によってその試みは失敗します。)

メモリを書き込む前に読み取る予定がない場合は、 を使用するmallocと、OS から新しいページを取得する代わりに、内部の空きリストからダーティ メモリを (潜在的に) 取得できるようになります。(または、小さな割り当てのために空きリストのメモリ ブロックをゼロにする代わりに)。


の組み込み実装で​​は、 OS がない場合、またはプロセス間の情報漏洩を防ぐためにページをゼロにする高度なマルチユーザー OS でない場合は、メモリをゼロにするかどうかは OScallocに任せることがcallocできます。

組み込みLinuxでは、mallocはmmap(MAP_UNINITIALIZED|MAP_ANONYMOUS)これは、マルチユーザー システムでは安全ではないため、一部の組み込みカーネルでのみ有効になっています。

おすすめ記事