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

Размер указателей: зависимые факторы

Я нахожу трудности в понимании факторов, от которых зависит размер переменных указателя в C. Я проверил несколько ссылок, единственная информация, которую я получил до сих пор, - это размер pointer зависит от архитектуры процессора . Мне хотелось бы знать следующие сведения

  • Пожалуйста, объясните подробнее о том, как architecure влияет на размер указателя.
  • В общем случае, если указатель имеет x bits, тогда 0 to 2^(X)-1 должно быть число адресов адресов. Я теряю трек, связывая количество адресов и объем памяти, доступный для программы.
4b9b3361

Ответ 1

Указатель - это переменная, которая содержит адрес другой ячейки памяти.

Теперь, если вы работаете в 32-битной архитектуре, CPU регистрирует, что они содержат ссылки на память (и, скорее всего, все остальные регистры тоже) будут иметь длину 32 бит; что в основном означает 32-разрядный (регистры имеют длину 32-битного слова), и, следовательно, указатель (который является местом памяти) будет обычно быть 32-битным (4 байта)

То же самое относится к 64-разрядным ЦП, и поэтому указатели в программе на языке С, скомпилированные для 64-разрядных ЦП, будут обычно иметь длину 8 байтов (64 бит)

EDIT:
Также обратите внимание, что в большинстве современных архитектур вы действительно не обращаетесь к физической памяти с вашим кодом; вы запускаете и адресуете то, что называется виртуальной памятью.

Основная концепция заключается в том, что комбинация CPU/OS отличает вашу программу от полного адресного пространства для вас.

Опять же, длина адресного пространства (пространство, которое вы можете указывать в памяти) будет зависеть от того, насколько процессор может адресовать местоположения и что (в общем случае) будет зависеть от его размера слова.

Ответ 2

Размер указателя зависит от множества факторов (аппаратное обеспечение, операционная система, компилятор и т.д.), а не все типы указателей на одной платформе могут иметь одинаковый размер. Например, есть встроенные процессоры, которые используют архитектуру Гарварда, где код и данные находятся в отдельных областях памяти, и каждый из них может иметь другой размер шины (например, 8 бит для данных, 16 бит для кода). Это означает, что указатели объектов (int *, char *, double *) могут иметь ширину 8 бит, но указатели на функции (int (*)()) могут иметь ширину 16 бит.

В качестве другого примера рассмотрим архитектуру с обращением к словам, где базовая единица памяти не является 8-битным байтом, а более крупным блоком (где ширина может быть 16, 18, 24, 32, 36, 64, или 128 бит, или какое-то другое значение, степени 2 оказались удобными, но не необходимыми). Некоторые из этих архитектур могут выбрать, чтобы упаковать несколько значений char в одно слово, а это означает, что char * требуется несколько дополнительных бит, чтобы указать смещение в слове.

В книге C: Справочное руководство Харбисон и Стил описывают архитектуру с 36-битными словами. Символьные данные сохранялись как 7-разрядные значения ASCII, то есть каждое слово могло содержать 5 символов с одним неиспользуемым битом; все остальные типы заняли полные слова.

Ответ 3

Я нахожу трудности в понимании факторов, от которых зависит размер переменных указателя в C. Я проверил несколько ссылок, единственная информация, которую я получил до сих пор, - это размер указателя зависит от архитектуры процессора. Это 4 байта на 32-битной машине и 8 байтов на 64-битной машине. Я хотел бы знать следующие подробности.

Это не обязательно так, в любом случае вам нужно понять, что размер указателя содержит адрес виртуального адреса (в ОС, который его поддерживает). Поэтому размер указателя зависит от ширины шины памяти. Вот почему архитектура влияет на размер указателей. Обратите внимание, что это не так все время: все указатели могут не иметь одинакового размера, например.