Есть ли смысл иметь указатели размером менее 8 байт в 64-битных системах? - PullRequest
2 голосов
/ 26 октября 2010

Мы знаем, что в 64-битных компьютерах указатели будут 8 байтов, это позволит нам обратиться к огромной памяти. Но с другой стороны, воспоминания, которые доступны обычным людям теперь до 16G, это означает, что на данный момент нам не нужно 8 байтов для addressig, но 5 или максимум 6 байтов.

Я пользователь Delphi.

Вопрос (вероятно, для разработчиков 64-битного компилятора):

Можно ли где-то объявить, сколько байтов вы бы хотели используйте для указателей, и это будет действовать для всего приложения. В случае, если у вас есть приложение с миллионами указателей, и вы будете быть в состоянии объявить, что указатели имеют только 5 байтов, объем памяти что будет занято будет намного ниже. Я могу представить, что это может быть трудно реализовать, но мне все равно любопытно об этом.

Заранее спасибо.

Ответы [ 5 ]

5 голосов
/ 27 октября 2010

Существуют и другие способы использования 8-байтовых указателей с повышенной точностью: например, вы можете закодировать класс ссылки (в виде порядкового индекса) в сам указатель, украв 10 или 20 бит из 64 доступных оставляя более чем достаточно для доступных в настоящее время систем.

Это может позволить составителю компилятора выполнить встроенное кэширование виртуальных методов без затрат на косвенное обращение при подтверждении того, что экземпляр имеет ожидаемый тип.

5 голосов
/ 26 октября 2010

Миллион 64-битных указателей займет менее восьми мегабайт.Это ничего.Типичный современный компьютер имеет 6 ГБ оперативной памяти.Следовательно, 8 МБ - это чуть больше, чем 1 пермилл от общего объема ОЗУ.

4 голосов
/ 26 октября 2010

На самом деле, это не спасло бы память.Распределение памяти должно быть выровнено в зависимости от размера того, что вы выделяете.Например, 4-байтовый раздел памяти должен быть кратен 4. Таким образом, из-за заполнения, чтобы выровнять ваши 5-байтовые указатели, они фактически потребляют такой же объем памяти.

3 голосов
/ 27 октября 2010

Помните, что реальные ОС не позволяют вам использовать физические адреса. Пользовательские процессы всегда используют виртуальные адреса (обычно только ядро ​​может получить доступ к физическим адресам). Процессор будет прозрачно превращать виртуальные адреса в физические адреса. Это означает, что вы можете обнаружить, что ваша программа использует указатели на виртуальные адреса, достаточно большие, чтобы у них не было аналога реального адреса для данной системы. Это всегда происходило в 32-битной Windows, где библиотеки DLL отображались в верхних 2 ГБ (адресное пространство виртуального процесса, всегда 4 ГБ), даже когда на машине было намного меньше 2 ГБ памяти (фактически это начиналось, когда на ПК было всего несколько мегабайт - это не важно) Таким образом, использование «маленьких» указателей - это нонсенс (даже игнорирование всех других факторов, таких как доступ к памяти, размеры регистров, инструкции стандартного операнда sizez и т. Д.), Которые только уменьшают доступное виртуальное адресное пространство. Также для таких методов, как файлы с отображением в памяти, необходимы «большие» указатели для доступа к файлу, который может быть намного больше доступной памяти.

0 голосов
/ 22 декабря 2010

Другое использование для некоторого избыточного пространства указателя было бы для хранения определенных типов значений без упаковки.Я не уверен, что нужен механизм общего назначения для типов с малыми значениями, но, безусловно, было бы разумно кодировать все 32-разрядные целые числа со знаком и без знака, а также все числа с плавающей запятой одинарной точности и, возможно, множество значений типа'long' и 'unsigned long' (например, все те, которые могут быть точно представлены как int, unsigned int или float).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...