Максимальный объем памяти, который может быть выделен динамически и во время компиляции в c ++

Я играю вокруг, чтобы понять, сколько памяти можно выделить. Первоначально я думал, что максимальный объем памяти, который может быть выделен, равен физической памяти (RAM). Я проверил свою оперативную память в Ubuntu 12.04, выполнив команду, как показано ниже:

~$ free -b
             total       used       free     shared    buffers     cached
Mem:    3170848768 2526740480  644108288          0  265547776 1360060416
-/+ buffers/cache:  901132288 2269716480
Swap:   2428497920          0 2428497920

Как показано выше, общая физическая память составляет 3Gig (3170848768 байт), из которых только 644108288 байт свободны, поэтому я предположил, что в максимальном объеме могу выделить только столько памяти. Я проверил это, написав небольшую программу с двумя строками ниже:

char * p1 = new char[644108290] ;
delete p1;

Поскольку код работает отлично, это означает, что он успешно распределил память. Также я попытался выделить память больше, чем доступная физическая свободная память, но это не выдало никакой ошибки. Тогда за вопрос

максимальный объем памяти, который может выделить malloc

Я думал, что это должно быть использование виртуальной памяти. Так что я проверил код для свободной подкачки памяти, и это также сработало.

char * p1 = new char[2428497920] ;
delete p1;

Я попытался выделить свободный обмен плюс свободные байты оперативной памяти

char * p1 = new char[3072606208] ;
delete p1;

Но на этот раз код не удалсяbad_alloc исключение. Почему код не сработал на этот раз.

Теперь я выделил память во время компиляции в новой программе, как показано ниже:

char p[3072606208] ;
char p2[4072606208] ;
char p3[5072606208];
cout<<"Size of array p = " <<sizeof p <<endl;
cout<<"Size of array p2 = " <<sizeof p2<<endl;
cout<<"Size of array p2 = " <<sizeof p3;

Out Put показывает

Size of array p = 3072606208
Size of array p1 = 4072606208
Size of array p2 = 777638912

Не могли бы вы помочь мне понять, что здесь происходит. Почему это позволило распределить память во время компиляции, но не динамически. Когда выделено время компиляции, как получитсяp а такжеp1 были в состоянии выделить память больше, чем подкачка плюс свободная память RAM. В то время какp2 не удалось. Как именно это работает. Это какое-то неопределенное поведение или специфическое поведение. Спасибо за вашу помощь. Я использую Ubuntu 12.04 и gcc 4.6.3.

Ответы на вопрос(5)

Ваш ответ на вопрос