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