CI では、使用したことがない場合や代わりにmalloc()
使用した場合に、ジャンク データを含むメモリを割り当てることができる場合があることを理解してください。memset()
calloc()
ジャンク データの収集はどのくらいの頻度で発生しますか?
calloc()
またはmemset()
毎回使用することなく、これを回避する安全な方法はありますか?
「ジャンクデータ」を拾い上げ、割り当てられたメモリをプログラムで意味のあるものに初期化することについて常に心配する必要があります。
malloc によって割り当てられたメモリが特定の値に初期化されるという保証はありません。
コンストラクターが変数を初期化し、memset が適切な値にメモリを割り当てたことを確認する必要があります。
このmalloc()
関数は、基本的に 2 つの異なる場所からメモリを取得します。
オペレーティング システム (カーネル) から直接メモリを要求します。Linux や OS X などの Unix システムでは、これはmmap()
またはsbrk()
システム コールで実行されます。カーネルからのメモリは、最初から常にゼロで初期化されます。
以前に で解放されたメモリを再利用しfree()
ます。これは常にがらくたでいっぱいであると想定されています。
を使用するだけcalloc()
です。関数はcalloc()
、メモリがどのプールから来たかを知っています。それが OS からのものである場合、それはすでにゼロで初期化されており、無料でゼロ化されたメモリを取得します。メモリが からのものである場合、 はfree()
それcalloc()
をゼロにします。詳細については、malloc+memset が calloc より遅い理由を参照してください。
怠け者のための要約:calloc()
関数は、あなたが考えている最適化を既に実行しています。
毎回 calloc() または memset() を使用せずにこれを回避する安全な方法はありますか?
少なくともWindowsにはあります。VirtualAlloc()
直接電話する:
VirtualAlloc 関数 (Windows)
呼び出しプロセスの仮想アドレス空間でページの領域を予約またはコミットします。この関数によって割り当てられたメモリは、MEM_RESET が指定されていない限り、自動的にゼロに初期化されます。