В чем преимущества более крупных указателей на 64-битных системах?
Я пытаюсь понять 64-битную компиляцию, поэтому я сделал небольшой тест в С++ Builder:
int i = 12345;
ShowMessage(i);
int *pi = &i;
ShowMessage(sizeof(pi));
Largeint li = 9223372036854775807;
ShowMessage(li);
Largeint *pli = &li;
ShowMessage(sizeof(pli));
Когда я компилирую эту программу как 64 бит, размер указателя увеличивается до 8 байтов (64 бит).
В чем преимущество увеличения размера указателя?
Ответы
Ответ 1
Указатель может содержать адрес одного байта в памяти. На основе его размера вы можете рассчитать максимальное количество различных значений, которые может хранить данный указатель.
С указателем 4 байта (32 бита) вы ограничены адресом только 4 ГБ, так как:
2^32 = 4294967296
С другой стороны, указатель 8 байт (64-разрядный) способен решать гораздо более широкий диапазон 17179869184GB:
2^64 = 18446744073709551616
Это 16EB (exabytes).
В практике это значительно меньше , из-за ограничений для большинства процессоров и физического размера памяти и т.д.
Вы можете прочитать больше здесь:
https://en.wikipedia.org/wiki/64-bit_computing#Limitations_of_practical_processors
Ответ 2
Если вы не захотите вернуться к старым страницам подкачки памяти (помните эти 16-разрядные машины Z80 в 1980-е годы с 128-разрядной ОЗУ) или ранней расширенной памяти DOS, тогда вам нужно больше 32-битного указателя для адресации всех доступной памяти на современной машине.
64-разрядный указатель является естественным (хотя и не необходимым) выбором для 64-битной архитектуры.
Обратите внимание, что указатели разных типов не должны иметь одинаковый размер: sizeof(double*)
не обязательно должен быть таким же, как sizeof(int*)
, например.
Ответ 3
Как объясняется в других ответах, естественно иметь тип указателя, который может равномерно и легко указывать произвольное местоположение в памяти.
Теперь, если у вас сложная структура данных, в которой используются небольшие объекты и указатели между ними (например, граф, дерево), память, получаемая указателями, будет удвоена при компиляции в 64 битах, что является недостатком (и вероятно, поэтому вы задали вопрос).
Обратите внимание, что все эти структуры данных (график, дерево, хэш-карта и т.д.) также могут быть реализованы в смежных массивах в памяти и доступны через индексы (например, как программисты FORTRAN реализуют их), и если вы заранее знаете, что у вас есть менее 4 миллиардов элементов, тогда вы можете представить свои индексы как 32-битные целые числа, даже когда вы компилируете в режиме 64 бит (это то, что я делаю для программного обеспечения для моделирования 3D-сетки).