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