#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. Это может быть, как вы говорите, усеченная версия адреса.