Подтвердить что ты не робот

В чем преимущества более крупных указателей на 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 бит).

В чем преимущество увеличения размера указателя?

4b9b3361

Ответ 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-сетки).