Estou executando um programa C++ simples para aprender sobre memória alocada dinamicamente ( malloc
, realloc
e free
).
Aqui está um trecho do meu código:
void *p = malloc(10); // Allocates 10 bytes in memory; `p` is a pointer to the first byte.
cout << "The value of the pointer p is: " << p << endl;
Isso gera algo como isto:
The value of the pointer p is: 0x7fbf36c00080
Estou ciente de que o número hexadecimal é o local de memória apontado por p
, que é o primeiro local de memória dessa alocação.
Ao tentar calcular aproximadamente quanta RAM eu tenho, observei o número de dígitos nesse número hexadecimal (12 dígitos) e aumentei 16 para essa potência.
Acontece que 16 ^ 12 é aproximadamente igual a 2,8 x 10 ^ 14 e, como cada local de memória armazena um byte, isso significa que tenho cerca de 280 TERABYTES de RAM, embora saiba que tenho 8 GB.
Onde foi que errei no meu cálculo?
Você deve estudar o conceito de memória virtual para entender que a memória física é mapeada no espaço de endereço do processo.
O fato de um processo de 64 bits poder ter ponteiros que vão até 2 64 -1 não significa que toda essa memória exista. O ponteiro aponta para um segmento de memória que é mapeado para a memória física em algum lugar do computador.
Apenas o sistema operacional sabe quanta memória você realmente tem, então você precisa usar sua API para recuperar essa quantidade.
Conforme ilustrado no meu primeiro link da Wikipedia: