Memoria máxima que se puede asignar de forma dinámica y en tiempo de compilación en c ++
Estoy jugando para entender cuánta memoria se puede asignar. Inicialmente pensé que la memoria máxima que se puede asignar es igual a la memoria física (RAM). Revisé mi RAM en Ubuntu 12.04 ejecutando el comando como se muestra a continuación:
~$ free -b
total used free shared buffers cached
Mem: 3170848768 2526740480 644108288 0 265547776 1360060416
-/+ buffers/cache: 901132288 2269716480
Swap: 2428497920 0 2428497920
Como se muestra arriba, la memoria física total es 3Gig (3170848768 bytes), de los cuales solo 644108288 bytes están libres, así que asumí que puedo asignar al máximo solo esta cantidad de memoria. Lo probé escribiendo el pequeño programa con solo dos líneas a continuación:
char * p1 = new char[644108290] ;
delete p1;
Dado que el código se ejecutó perfectamente, significa que asignó memoria correctamente. También intenté asignar la memoria mayor que la memoria libre física disponible, pero no arrojó ningún error. Entonces por pregunta
memoria máxima que malloc puede asignar
Pensé que debía estar usando la memoria virtual. Así que probé el código para la memoria de intercambio libre y también funcionó.
char * p1 = new char[2428497920] ;
delete p1;
Intenté asignar el intercambio libre más los bytes de memoria RAM libres
char * p1 = new char[3072606208] ;
delete p1;
Pero este código de tiempo falló tirando elbad_alloc
Excepción. Por qué el código no funcionó esta vez.
Ahora asigné la memoria en tiempo de compilación en un nuevo programa como se muestra a continuación:
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;
Los espectáculos de salida
Size of array p = 3072606208
Size of array p1 = 4072606208
Size of array p2 = 777638912
¿Podría por favor ayudarme a entender lo que está pasando aquí? ¿Por qué permitió que la memoria se asignara en el momento de la compilación pero no de forma dinámica? Cuando se asigna el tiempo de compilación comop
yp1
fueron capaces de asignar memoria mayor que el intercambio más memoria RAM libre. Donde comop2
ha fallado. ¿Cómo funciona exactamente esto? Es este un comportamiento indefinido o un comportamiento específico del sistema operativo. Gracias por tu ayuda. Estoy usando Ubuntu 12.04 y gcc 4.6.3.