[解決済み] mallocとcallocの違い?
質問
することの違いは何ですか。
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)
これは、マルチユーザーシステムでは安全でないため、一部の組み込みカーネルのみで有効になっています。
関連
-
未定義の `__isoc99_sscanf' への参照
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] mallocの結果はキャストするのですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] スタティック・ライブラリとシェアード・ライブラリの違い?
-
[解決済み] floatとdoubleの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
[解決済み] Valgrind が初期化されていないバイトについて警告する
-
[解決済み] 初期化でポインタ対象の型から修飾語を捨てる
-
[解決済み] Linux Socket write() によるBad File Descriptor C
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] while ( !feof (file) ) 」は、なぜいつも間違っているのですか?
-
[解決済み] プログラム終了前にmallocの後にfreeをしないと本当に何が起こるのか?
-
[解決済み] C言語でファイルが存在するかどうかを確認する最も良い方法は何ですか?
-
[解決済み] C 言語の配列へのポインタ/ポインタの配列の曖昧さ解消
-
[解決済み] なぜ16進数には0xがつくのですか?