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 assim:
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 desta alocação.
Ao tentar calcular aproximadamente quanta RAM eu tenho, olhei para o número de dígitos daquele número hexadecimal (12 dígitos) e elevei 16 a essa potência.
Acontece que 16^12 é aproximadamente igual a 2,8x10^14 e como cada local de memória armazena um byte, isso significa que tenho cerca de 280 TERABYTES de RAM, mesmo sabendo que tenho 8 GB.
Onde foi que errei no meu cálculo?
Responder1
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 indo até 2 64 -1 não significa que toda essa memória exista. O ponteiro aponta para um segmento de memória que está mapeado para a memória física em algum lugar do computador.
Somente o sistema operacional sabe quanta memória você realmente possui, então você precisa usar sua API para recuperar essa quantidade.
Conforme ilustrado em meu primeiro link da Wikipedia: