Могут ли указатели быть разных размеров?
Этот ответ содержит интересное выражение - "на машинах, где int*
меньше, чем char*
". (пусть исключают указатели на функции)
Возможно ли, чтобы указатели разных типов имели разные размеры? Почему это было бы полезно?
Ответы
Ответ 1
Да, это вполне возможно. На некоторых машинах указатель на байт содержит два значения: указатель на адрес WORD слова памяти, содержащий байт, и "байтовый индекс", который дает положение байта внутри слова. Например. на 32-битной машине "индекс байта" равен 0..3.
Для этого потребуется больше места для хранения, чем "int *", что является просто указателем на соответствующее слово.
Ответ 2
На машинах с надписью, адресованных на языке char*
, возможно, потребуется содержать информацию о неполных словах, делая ее больше, чем int*
.
Стандарт позволяет это, а не исключать реализации на таком оборудовании (хотя это еще реже, чем когда был разработан C89).
Ответ 3
language-lawyer означает, что вы спрашивают о С++ и его совместимых реализациях, а не о конкретной физической машине.
Мне нужно процитировать весь стандарт, чтобы доказать это, но простой факт заключается в том, что он не дает никаких гарантий для результата sizeof(T*)
для любого T
, и (как следствие) не гарантирует, что sizeof(T1*) == sizeof(T2*)
для любых T1
и T2
).
Ответ 4
Да, указатели не гарантированно имеют одинаковый размер, хотя на большинстве современных архитектур они на практике.
Один момент, когда это может быть полезно, - это когда речь идет о указателях данных и указателей на функции. Исторически, указатели на функции (которые обычно используются для перехода к определенным частям исполняемого кода) нуждаются в так называемых "дальних указателях", которые шире, чем указатели данных.
Ответ 5
Я могу представить себе машину, где имеет смысл предположить, что память для массивов int
будет намного меньше, чем потребности памяти в массивах char
.
Можно указать, например, что реализация не будет использовать более 10 динамически выделенных целых чисел, но может свободно выделять множество массивов char
. В этом случае для байта int*
может быть достаточно одного байта, а char*
должно быть четыре байта или более.
Это теоретическое видение.