Я запускаю простую программу на C++, чтобы изучить динамически выделяемую память ( malloc
, realloc
и free
).
Вот фрагмент моего кода:
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;
Выводится что-то вроде этого:
The value of the pointer p is: 0x7fbf36c00080
Я знаю, что шестнадцатеричное число — это ячейка памяти, на которую указывает p
, которая является первой ячейкой памяти этого выделения.
Пытаясь приблизительно подсчитать, сколько у меня оперативной памяти, я посмотрел на количество цифр в этом шестнадцатеричном числе (12 цифр) и возвел 16 в эту степень.
Оказывается, 16^12 примерно равно 2,8x10^14, а поскольку каждая ячейка памяти хранит один байт, это означает, что у меня около 280 ТЕРАБАЙТ оперативной памяти, хотя я знаю, что у меня 8 ГБ.
Где я ошибся в своих расчетах?
решение1
Вам следует изучить концепцию Виртуальная память, чтобы понять, что физическая память отображается в адресное пространство процесса.
Тот факт, что 64-битный процесс может иметь указатели, доходящие до 2 64 -1, не означает, что вся эта память существует. Указатель указывает на сегмент памяти который отображается в физической памяти где-то в компьютере.
Только операционная система знает, сколько у вас на самом деле памяти, поэтому вам нужно использовать ее API для получения этого объема.
Как показано в моей первой ссылке на Википедию: