1. ホーム
  2. c

[解決済み] mallocとcallocの違い?

2022-03-19 19:20:24

質問

することの違いは何ですか。

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

または

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

mallocよりcallocを使うのが良い場合、またはその逆の場合はいつですか?

どのように解決するのですか?

calloc() は初期化ゼロのバッファを与えるのに対し malloc() はメモリを初期化しないままです。

大きなアロケーションの場合、ほとんどの calloc の実装では、OS から既知のゼロページを取得します(例:POSIX の mmap(MAP_ANONYMOUS) またはWindows VirtualAlloc )なので、ユーザースペースに書く必要はない。 このように、通常の malloc は、OSからも多くのページを取得します。 calloc は、OSの保証を利用するだけです。

これはつまり calloc メモリはまだ "クリーン"であり、遅延的に割り当てられ、ゼロのシステム全体の共有物理ページにコピーオンライトでマップされることができます。 (仮想メモリのあるシステムを想定しています)。

コンパイラによっては、malloc + memset(0) を calloc に最適化してくれるものもありますが、メモリを以下のように読み込ませたい場合は、明示的に calloc を使用する必要があります。 0 .

メモリを書き込む前に読み込むことがないのであれば malloc OS から新しいページを取得する代わりに、内部の空きリストからダーティメモリを取得できる(可能性がある)ようにします。 (あるいは、小さなアロケーションのためにフリーリスト上のメモリブロックをゼロにする代わりに)。


の埋め込み実装は calloc に任せることがあります。 calloc は、OS がない場合、あるいはプロセス間の情報漏えいを防ぐためにページをゼロにするような高級マルチユーザーOS でない場合、それ自身がメモリをゼロにすることができます。

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