Будет ли это 64-битный адрес или он все еще 32-битный или, как я мог ошибочно прочитать, адреса 48-битные? Или Intel использует 32-битный адрес одной ячейки и половину другой 32-битной ячейки, что составляет 48 бит? Таким образом, используя один символьный указатель для переменной, какой будет размер самого адреса (0xFFEDEDAC) 4 байта?
1 ответ
Если мы говорим о виртуальных адресах, которые являются адресами, используемыми кодом, работающим под любой современной операционной системой .... и программами, работающими в "длинном режиме" ... адреса обычно хранятся в 64 битах (восемь байтов). Но в архитектурной спецификации реализованы только младшие 48 бит. Остальные 16 битов (биты с 48 по 63) должны быть копией бита 47, самого высокого порядка реализованных битов.
В результате получается адресное пространство, которое на первый взгляд работает от 0x00000000'00000000 до 0xFFFFFFFF'FFFFFFFF. Но единственные адреса, которые действительно могут использоваться, это адреса в следующих диапазонах:
0x00000000'00000000 through 0x00007FFF'FFFFFFFF
0xFFFF8000'00000000 through 0xFFFFFFFF'FFFFFFFF
В результате получается теоретическое адресное пространство от 2 до 64 байтов (16 exbibytes, или около 18x10 ^ 18). Эти числа, конечно, являются квадратами для 32-битных процессоров. Но в действительности реализовано только 256 ^ 48 байт, причем последний разделен на две равные половины по 128 ТиБ каждая.
(Пользовательский режим в Windows использует первую половину, которая создается заново для каждого процесса. Режим ядра использует вторую половину, которая в основном является общей для всех процессов.)
Кстати, в памяти нет 64- или 32-битных "ячеек". Есть только байты. x86/x64 адресно-байтовые.
Для вашего конкретного примера ваш указатель будет занимать 8 байт в памяти ... если вы не запускаете 32-разрядную программу в режиме совместимости, в этом случае он будет занимать 4 байта.