Стандарт C позволяет указателям на разные типы иметь разные размеры, например. sizeof(char*) != sizeof(int*)
разрешено. Однако он требует, чтобы, если указатель преобразуется в void*
, а затем преобразован обратно в исходный тип, он должен сравниваться как равный его исходному значению. Следовательно, логически следует, что sizeof(void*) >= sizeof(T*)
для всех типов T
, правильно?
В большинстве распространенных сегодня платформ (x86, PPC, ARM и 64-битные варианты и т.д.) размер всех указателей равен размеру собственного регистра (4 или 8 байтов), независимо от того, тип. Существуют ли какие-либо эзотерические или встроенные платформы, где указатели на разные типы могут иметь разные размеры? Я специально спрашиваю о указателях данных, хотя мне также было бы интересно узнать, есть ли платформы, где указатели функций имеют необычные размеры.
Я определенно не спрашиваю о указателях-указателях С++ и указателях-членах. Они занимают необычные размеры на общих платформах и могут даже варьироваться в пределах одной платформы, в зависимости от свойств класса-указателя (не полиморфного, одиночного наследования, множественного наследования, виртуального наследования или неполного типа).