私は基本的にこのコードを持っています。
char (* text)[1][80];
text = calloc(2821522,80);
私が計算した方法では、callocは215.265045メガバイトのRAMを割り当てる必要がありましたが、最終的にプログラムはその数を超え、700MB近くのRAMを割り当てました。
そのため、その関数が割り当てるメモリの量を正しく知ることができないようです。
そのプロパティをどのように計算しますか?
calloc
(さらにmalloc
言えば)要求を満たすために必要なだけのスペースを自由に割り当てることができます。
ですから、いいえ、それが実際にどれだけあなたに与えるかを前もって知ることはできません、あなたはそれがあなたにあなたが要求した量を与えたと仮定することができるだけです。
そうは言っても、700Mは少し過剰に思えるのでcalloc
、たとえば、それ以上のことは何もしないプログラムによって、が単独calloc
でその責任を負っていたかどうかを調査したいと思います。
また、そのメモリ使用量をどのように測定しているかを調査することもできます。
たとえば、次のプログラム:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
int main (void) {
char (* text)[1][80];
struct mallinfo mi;
mi = mallinfo(); printf ("%d\n", mi.uordblks);
text = calloc(2821522,80);
mi = mallinfo(); printf ("%d\n", mi.uordblks);
return 0;
}
私のシステムでの出力:
66144
225903256
これは、が要求されたの上のsmidgeon(バイトまたは)のみであるバイトをcalloc
割り当てたことを意味します。225,837,112
115,352
0.05%
225,721,760
まあそれはmalloc/callocの基礎となる実装に依存します。
これは一般的に次のように機能します-ヒープの最上部を指すヒープポインタと呼ばれるものがあります-動的メモリが割り当てられる領域です。メモリが最初に割り当てられると、mallocはカーネルにx個のメモリを内部的に要求します。つまり、ヒープポインタは、そのスペースを使用可能にするために特定の量だけインクリメントします。そのxは、要求したメモリブロックのサイズと等しい場合と等しくない場合があります(将来のmallocを考慮して、より大きくなる可能性があります)。そうでない場合は、少なくとも要求した量のメモリが与えられます(アライメントの問題のために、より多くのメモリが与えられる場合があります)。残りは、mallocによって維持される内部フリーリストの一部になります。要約すると、mallocにはいくつかの基礎となるデータ構造があり、それらがどのように実装されているかに大きく依存します。
私の推測では、メモリのx量は(何らかの理由で)要求したよりも多かったため、malloc/callocは空きリストの残りの部分を保持していました。さらにメモリを割り当てて、フットプリントが増加するかどうかを確認してください。