2015-06-05 2 views
1

Я работаю над заказом данных Peano-Hilbert (C++ 4.9, linux 64x), чтобы объединить динамически выделенную память. Для управления я пытаюсь визуализировать фактическое распределение данных в памяти. Для этого я конвертирую указатели на свои данные в целые числа, например:Значение указателя превышает доступную память? Как?

unsigned long int address = *(unsigned long int*)(&pointer); 

а затем начертить их как некоторые 2D-карты. Он отлично работает для большинства случаев, но иногда я получаю значения, превышающие доступную память, например. 140170747903888, что соответствует сдвигу ~ 127 ТБ, тогда как у меня всего 16 ГБ ОЗУ. Какого черта?

+0

Если вы строите с '' '-m64'''', то' '' sizeof (void *) == 8''' и '' 'sizeof (long int) == 4'''. Используйте '' 'long long int'''. – onqtam

+1

@onqtam 'long int' * может * быть только четыре байта, это также может быть восемь байтов. Это зависит от компилятора. С GCC на Linux 'long int' обычно составляет восемь байтов. –

+3

Это [виртуальная память] (https://en.wikipedia.org/wiki/Virtual_memory). –

ответ

2

Система управления памятью не обрабатывает память линейным способом. Можно сказать, что какой-то блок памяти находится в адресе 0x1234123412345678, даже если у вас только 128 МБ памяти. Это называется пейджинг. Данные могут быть даже не в физической памяти, а на диск.

Это означает, что у вас нет возможности узнать, где в физической памяти что-либо из значения указателя, поскольку оно может постоянно меняться (или может быть даже не в памяти), вы знаете только виртуальный адрес ОС вам удалось. И это полностью зависит от реализации, как оно их выдает.

+0

Спасибо! мне кажется, что это случай. Я знал о VAS, но я думал, что крайне маловероятно использовать такие огромные терабайтные сдвиги. Поэтому я справлю адреса данных с минимальным. Еще раз спасибо за быстрый ответ! –

1

AMD 64 бит использует 48 бит для адресов виртуальной памяти, что соответствует 256 ТБ. Виртуальное адресное пространство отличается от физической ОЗУ: адреса просматриваются в таблице на ЦПУ и фактическая ОЗУ, с которой происходит ошибка при первом обращении к страницам.

Смежные вопросы