очевидное несоответствие с размером и адресом

#c #sizeof #address-operator

#c #размер #адрес-оператор

Вопрос:

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

Комментарии:

1. Возможно, мне следовало использовать другие слова или другое расположение слов. Я действительно понимаю разницу между оператором адреса и оператором sizeof. Каким-то образом существовало / существует подсознательное предположение, что если размер (примитивного) типа равен 8 байтам, его адрес также должен иметь длину 8 байт. Если адрес не равен 8 байтам, то, по-видимому, это не 64-разрядная система. Тем не менее, почти все ваши ответы были полезны для понимания того, что, как выразился @Jens Gustedt, «… 64-разрядный для адресов, но не все из них используются …». Большое спасибо всем, кто ответил.

Ответ №1:

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

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

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

Ответ №2:

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

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

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

Комментарии:

1. Интересно, что все первые два байта равны нулю. Не могли бы вы подробнее рассказать о том, «как устроена память»?

Ответ №3:

Адрес — это ячейка памяти. В 32-разрядной системе он будет иметь длину 32 бита, в 64-разрядной системе — 64 бита и так далее.

Переменная sizeof of — это то, сколько памяти она занимает. Это совершенно не связанные между собой числа.

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

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

 int x = 0x0000000F;
printf( "%X", x );
// prints "F"
 

Комментарии:

1. В том-то и дело. Он не «показывает» 64-битный адрес, только 48-битный (12 шестнадцатеричных цифр). Переменная типа long занимает 8 байт. Вот адреса некоторых переменных типа long: Адрес a: 0x7fff6338eb08 Адрес b: 0x7fff6338eb00 Адрес c: 0x7fff6338eaf8

2. Возможно, они не совсем не связаны между собой. Насколько я понимаю, размер адреса памяти определяет максимальный объем памяти, на который можно ссылаться. Итак, если размер указанного выше адреса равен 48 битам, то как это может быть 64-битная система?

3. @spinozagl: Потому что начальные 0 не печатаются. sizeof( some_pointer_type) == 8 — вот что имеет значение.

Ответ №4:

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

Комментарии:

1. Это может быть, как вы говорите, усеченная версия адреса.