どこまで realloc 出来るか
じゃあ,malloc しまくるのを止めて,realloc で徐々に領域を広げて行った場合,どこまで行けるか.
同様のプログラムだけど,for 文の中は realloc をぐるぐる回す.
#include <stdio.h> #include <stdlib.h> #include <errno.h> int main() { const int size = 1024*1024 ; int i ; char *p ; if ((p = (char*)malloc(size)) == NULL) exit(EXIT_FAILURE) ; for (i=0; ; i++) { if ((p = (char*)realloc(p, size*(i+1))) == NULL) { perror("realloc") ; break ; } } printf("Alloc size: %dMB\n", i) ; free(p); return(0) ; }
実行すると,
$ ./alloctest2 realloc: Cannot allocate memory Alloc size: 2047MB
これが 2GB 付近で止まるのは,
RLIMIT_AS
http://ktarn.www.linux.or.jp/JM/html/LDP_man-pages/man2/getrlimit.2.html
プロセスの仮想メモリ (アドレス空間) の最大サイズ (バイト単位)。 この制限は brk(2), mmap(2), mremap(2) の呼び出しに影響し、この制限を超えた場合はエラー ENOMEM で失敗する。また自動的なスタック拡張にも失敗する (さらに sigaltstack(2) を使った代替スタックを利用可能にしていなかった場合には、 SIGSEGV を生成してそのプロセスを kill する)。この値は long 型なので、32 ビットの long 型を持つマシンでは、この制限は最大で 2 GiB になるか、この資源が無制限になる。
かな? hira-consulting.com - 辺りを見ても.
違うような気も... 誰か教えてください.^^;
#include <sys/time.h> #include <sys/resource.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { struct rlimit *resource; if(getrlimit(RLIMIT_AS,resource)==-1){ exit(EXIT_FAILURE) ; } fprintf(stdout,"AS Max: %ld\n", resource->rlim_max); exit(0); }
$ ./test AS Max: -1