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

Каков размер указателя? От чего именно это зависит?

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

  • От чего зависит размер указателя?
  • Какая особенность архитектуры влияет на размер указателя? (Подробно)
  • Как компилятор влияет на размер указателя?
4b9b3361

Ответ 1

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

На практике это обычно связано с шириной адресов памяти базового оборудования, что обычно является наиболее эффективной для реализации компилятором. Однако есть исключения; например, С++-указатель-член-функция не имеет прямого сопоставления с аппаратными адресами, так как он должен представлять два объекта (функция и некоторое понятие типа).

Однако, даже оставляя это в стороне, все еще есть сложности. Например:

  • На большинстве современных аппаратных средств ваша программа будет работать с адресами виртуальной памяти, а не с физическими адресами (которые могут быть не одинаковой ширины). Если вы не пишете код пространства ядра.
  • На некоторых архитектурах (например, x86) базовое оборудование демонстрирует сегментированное адресное пространство. Это действительно сложно, но в основном абстрагируется ОС и системой виртуальной памяти. Если вы пишете код ядра или код для действительно старых x86, вам придется с этим справиться.
  • В текущих x86-64 (виртуальных) адресах памяти на самом деле всего 48 бит.
  • x86-64 поддерживает как 32-разрядные, так и 64-разрядные исполняемые файлы.
  • Возможно, вы работаете на виртуальной машине, которая снова может делать все, что захочет (относительно базовой физической машины).

Ответ 2

Этот вопрос был первоначально помечен C и С++, а не "агностик языка". Как язык-агностический вопрос он должен быть закрыт как слишком широкий, но я надеюсь, что ОП вернет его в исходную версию1, и поэтому я не голосую, чтобы закрыть. В качестве вопроса C/С++, в то время как в наибольшей степени ответственно, он был закрыт как слишком широкий, а затем, когда область действия была чрезвычайно расширена до неопровержимой, изменив эту привязку к языковой агностике, она была вновь открыта, поскольку теперь она подлежит ответу.

я & rsquo; m отвечает на исходный вопрос для С++, причем несколько бит знания C осыпаются здесь и там.

Я думаю, что нынешний "языко-агностический" вопрос является неопровержимым, несмотря на один из попыток ответа на язык-агностик.

1. От чего зависит размер указателя?

Минимальный требуемый размер обычного указателя данных зависит от максимального количества возможных мест расположения памяти объектов указанного типа или разных функций; чтобы различать n возможных мест, требуются биты ceil (lg2 ​​(n)).

Следовательно, минимальный размер указателя зависит от максимально возможного размера памяти.

И, следовательно, минимальный размер указателя также зависит от выравнивания заостренного типа. На некоторых архаичных машинах и, возможно, даже на некоторых существующих машинах (мейнфрейм?), Адресная единица памяти аппаратного уровня была word, например. 2 или 4 байта. Затем выровненные по слову данные могут быть адресованы небольшими указателями, а char* и, следовательно, также void* должны быть больше.

Следовательно, стандарт С++ 11 в п. 9.2.2/4 требует, чтобы "объект типа cv void* имел одинаковый представления и выравнивания как cv char*. "

Указатели функций функций на С++ более похожи на смещения, чем указатели, и часто больше, чем правильные указатели.


2. Какая особенность архитектуры влияет на размер указателя? (Подробно)

В основном адресный диапазон памяти, как видно на С++.

Но также стоит вспомнить, что в MS-DOS программировании выделяется один из ближайших и дальних указателей. Ближайший указатель был смещением в подразумеваемый сегмент памяти 64 КБ, в то время как дальний указатель, в два раза превышающий размер, объединял селектор сегмента и смещение.

В (по-прежнему) современные 32-разрядные программы программирования на ПК C и С++ указатели, как правило, схожи с ближайшими указателями, без поддержки дальних указателей, которые были бы 6 байтами. Чтобы использовать такие указатели, необходимо использовать другие языки, такие как язык ассемблера.


3. Изменяет ли компилятор размер указателя? Как?

Используемые параметры компилятора и компиляции могут в принципе влиять на размер указателя, поскольку размер не указан стандартом. Например. он может в принципе добавить информацию для помощи при отладке. Или, как уже упоминалось, с языковыми расширениями могут быть указатели с близкими и дальними.

Поскольку указатели элементов не являются непосредственно адресами (под капотом), это очень важно для компилятора, как их представлять, и насколько они велики.

Это также зависит от используемых опций.


4. Каковы различные типы указателей и как они отличаются друг от друга? (Например: есть ли разница между указателями функций и указателем, указывающим на базовый тип данных?, рядом с указателем и дальним указателем и т.д.)

В С++ 03 указатель функции не может быть преобразован в указатель данных или наоборот. Это ограничение поддерживало машины с архитектурой Гарварда, и оно поддерживало различные типы указателей функций и указателей данных (например, с первым как последним, так и последним). В С++ 11 такое преобразование условно поддерживается, в §5.2.10/8, в результате Отчет о дефектах 195.

Стоит отметить, что стандарт Posix требует поддержки преобразования (указатель функции) → (void*) и обратно, например. для функции dlsym.

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

Современный С++ не поддерживает ближние и дальние указатели.


5. Язык влияет на указатель. C vs С++

C не поддерживает указатели элементов, в том смысле, что они считаются указателями в этом вопросе.

Кроме того, основная цель С++ состоит в том, чтобы иметь возможность напрямую использовать библиотеки C, а стандарт C "включен" (С++ 11 §17.5.1.5/1) в стандарт С++, что требует совместимости представления указателей.

C поддерживает ограниченные указатели, квалификатор restrict, который С++ не поддерживает. Однако это влияет только на знание того, что компилятор имеет о возможных значениях указателя. Это означает, что компилятор C может создать лучший оптимизированный код.