очевидное расхождение с размерами и адресами - PullRequest
1 голос
/ 30 октября 2011

sizeof (long) возвращает 8 байтов, но & long (адрес long) составляет 12 шестнадцатеричных цифр (48 бит) или 6 байтов. На OS X 64-битная скомпилирована clang. Здесь есть расхождение или это подлинное 64-битное адресное пространство?

Ответы [ 4 ]

1 голос
/ 30 октября 2011

В действительности современные системы используют 64-битные адреса, но не все из них используются системой, поскольку от 2 до 64 - это объем памяти, который никто не будет использовать в ближайшем будущем. В Linux вы можете узнать, что на самом деле использует ваша машина, выполнив cat /proc/cpuinfo. На моей машине у меня есть, например,

размеры адресов: 36-битный физический, 48-битный виртуальный

, так что это позволит использовать 64 ГБ физической памяти и 256 ТБ виртуальной памяти. Этого в значительной степени достаточно для того, с чем эта машина когда-либо столкнется.

1 голос
/ 30 октября 2011

Обращайтесь к нам по памяти.В 32-разрядной системе длина будет 32-разрядной, в 64-разрядной - 64-разрядной и т. Д.

Переменная sizeof определяет, сколько памяти она занимает.Это совершенно не связанные числа.

sizeof (long) возвращает 8 байт, но & наряду (адрес long) составляет 12 шестнадцатеричных (48 бит) или 6 байтов.

Да, потому что при печати числа начальные 0 не печатаются.Например:

int x = 0x0000000F;
printf( "%X", x );
// prints "F"
1 голос
/ 30 октября 2011

Я думаю, что вы объединяете две разные концепции. Sizeof сообщает вам, насколько длинным является адрес, а не длинным. Long занимает шесть байтов памяти, но указатель на него (по-видимому) занимает всего 6 (или, скорее, занимает 8, но первые два равны нулю из-за того, как память размещена)

Позвольте мне расширить некоторые объяснения по поводу адресных пространств. Хотя указатели имеют длину 8 байтов в 64-битном процессоре, адресное пространство редко нуждается в этом. Это позволяет адресовать 2 ^ 64 байта, гораздо больше, чем нам нужно. Поэтому для простоты многие процессоры и компиляторы используют только 48 из этих битов. Смотрите эту ссылку в Википедии для нескольких полезных диаграмм:

http://en.wikipedia.org/wiki/X86-64#Canonical_form_addresses

0 голосов
/ 30 октября 2011

Я не уверен, является ли это точной причиной, по которой вы это видите, но современные 64-битные процессоры обычно не имеют 64-битного адресного пространства. Использование дополнительного оборудования было бы пустой тратой, поскольку 48 бит адресного пространства - это больше, чем я ожидал в своей жизни. Возможно, вы видите усеченную версию адреса (т. Е. Адрес не дополняется нулями).

...