Memória máxima que pode ser alocada dinamicamente e em tempo de compilação em c ++
Estou brincando para entender quanta memória pode ser alocada. Inicialmente eu pensei que a memória máxima que pode ser alocada é igual à memória física (RAM). Eu verifiquei minha RAM no Ubuntu 12.04 executando o comando como mostrado abaixo:
~$ free -b
total used free shared buffers cached
Mem: 3170848768 2526740480 644108288 0 265547776 1360060416
-/+ buffers/cache: 901132288 2269716480
Swap: 2428497920 0 2428497920
Como mostrado acima, a memória física total é 3Gig (3170848768 bytes), dos quais apenas 644108288 bytes são livres, então eu assumi que posso no máximo alocar apenas essa quantidade de memória. Eu testei escrevendo o pequeno programa com apenas duas linhas abaixo:
char * p1 = new char[644108290] ;
delete p1;
Como o código funcionou perfeitamente, significa que ele alocou memória com sucesso. Também tentei alocar a memória maior que a memória livre física disponível, ainda que não tenha lançado nenhum erro. Então por questão
memória máxima que malloc pode alocar
Eu pensei que deve estar usando a memória virtual.Então eu testei o código para memória de troca livre e também funcionou.
char * p1 = new char[2428497920] ;
delete p1;
Eu tentei alocar a troca livre mais bytes livres de RAM de memória
char * p1 = new char[3072606208] ;
delete p1;
Mas este código de tempo falhou jogando obad_alloc
exceção.Por que o código não funcionou desta vez.
Agora aloquei a memória em tempo de compilação em um novo programa como mostrado abaixo:
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;
Os shows expostos
Size of array p = 3072606208
Size of array p1 = 4072606208
Size of array p2 = 777638912
Você poderia por favor me ajudar a entender o que está acontecendo aqui? Por que permitiu que a memória fosse alocada no tempo de compilação, mas não em dinamicamente. Quando alocado tempo de compilação, comop
ep1
foram capazes de alocar memória maior que swap mais memória RAM livre. Enquanto quep2
falhou. Como exatamente isso está funcionando? Isso é algum comportamento indefinido ou comportamento específico. Obrigado pela ajuda. Eu estou usando o Ubuntu 12.04 e o gcc 4.6.3.