※ ChatGPTを利用し、要約された質問です(原文:取ってこれないメモリのはずのmallocの動作)
mallocの動作とコンパイル仕様について
このQ&Aのポイント
mallocの動作とコンパイルの仕様について質問があります。
32bitと64bitのUbuntuのgccとMacのgccでの動作の違いについて知りたいです。
Ubuntuでのメモリの取得制限と実際の動作が気になります。
こんにちは.mallocの動作,及びコンパイルの仕様について質問です.
以下のような.cのプログラムを書いてgccでコンパイルして実行してみました.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int size = 0;
int *tmp = NULL;
while(1){
printf("Size %d\n", size++);
tmp = (int *)malloc(size * 1024 * 1024);
usleep(10000);
free(tmp);
}
}
このプログラムだと,heapから取ってこれないぐらい大きいメモリだとなんか起きるのかな?どれぐらいまで取ってこれるのかな?という興味でやってみたのですが,
1)32bit, 64bit ubuntu のgcc (バージョンは覚えてないですけど一番updateされてると思います)では永遠に回り続け,
2)Mac のgccだとSize=2048以降,つまり2GB以降で
a.out(1145,0x7fff73a1b310) malloc: ***mach_vm_map(size=18446744071562067968) failed (error code=3)
*** error: can't allocate region
というエラーをはきます.(プログラムは回り続けます)
a. この違いはgccの違いからくるという理解でよろしいですか?Macでの2GBというのもコンパイル側の制約なのでしょうか?
b. ubuntuでは実際何が起こってるのでしょう?1000GBとか絶対取れないですけど回ってますし.
c. ubuntuで実際に何が起こってるかを確認する方法はありますか.アセンブラとか吐かせるのでしょうか?
お時間のあるときに回答してもらえたらと思います.
お礼
回答ありがとうございます.大変参考になるリッファレンスをありがとうございます.