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

Могут ли указатели быть разных размеров?

Этот ответ содержит интересное выражение - "на машинах, где int* меньше, чем char*". (пусть исключают указатели на функции)

Возможно ли, чтобы указатели разных типов имели разные размеры? Почему это было бы полезно?

4b9b3361

Ответ 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* должно быть четыре байта или более.

Это теоретическое видение.