以下の違いは何ですか?
ptr = malloc(MAXELEMS * sizeof(char *));
そして:
ptr = calloc(MAXELEMS, sizeof(char*));
calloc
どのような場合にover を使用するのが適切でしょうかmalloc
、またその逆は適切でしょうか?
ベストアンサー1
calloc()
はゼロ初期化されたバッファを提供しますが、malloc()
はメモリを初期化しないままにします。
大規模な割り当ての場合、calloc
主流の OS でのほとんどの実装では、既知のゼロ ページを OS から取得します (例: POSIXmmap(MAP_ANONYMOUS)
または Windows経由VirtualAlloc
)。そのため、ユーザー空間に書き込む必要はありません。通常、これはmalloc
OS からより多くのページを取得する方法であり、calloc
OS の保証を利用しているだけです。
これは、calloc
メモリが「クリーン」かつ遅延割り当てされ、システム全体で共有されるゼロの物理ページにコピーオンライトでマップされることを意味します。(仮想メモリを備えたシステムを想定)。効果は次のように確認できます。Linux でのパフォーマンス実験、 例えば。
一部のコンパイラでは、malloc + memset(0) を calloc に最適化することもできますが、メモリをゼロにしたい場合は、ソースで calloc を使用するのが最善です。(または、後でページ フォールトを回避するために事前にフォールトしようとしていた場合、その最適化によってその試みは失敗します。)
メモリを書き込む前に読み取る予定がない場合は、 を使用するmalloc
と、OS から新しいページを取得する代わりに、内部の空きリストからダーティ メモリを (潜在的に) 取得できるようになります。(または、小さな割り当てのために空きリストのメモリ ブロックをゼロにする代わりに)。
の組み込み実装では、 OS がない場合、またはプロセス間の情報漏洩を防ぐためにページをゼロにする高度なマルチユーザー OS でない場合は、メモリをゼロにするかどうかは OScalloc
に任せることがcalloc
できます。
組み込みLinuxでは、mallocはmmap(MAP_UNINITIALIZED|MAP_ANONYMOUS)
これは、マルチユーザー システムでは安全ではないため、一部の組み込みカーネルでのみ有効になっています。