Zeiger können grundsätzlich unterschiedliche Größen haben. Der größte Zeiger, wenn es einen Unterschied gibt (abgesehen von Element-Zeigern, sprechen über echte Zeiger), ist char*
, da ein char
definitionsgemäß ein Byte ist und irgendwo sein kann, keine Ausrichtung. void*
muss char*
darstellen können.
Auf einem System mit weniger Bits als int*
char*
Verwendung reinterpret gieße in diese Richtung könnte ein bisschen riskant.
Ich denke mit diesen Zeigern (heh) können Sie dies im Standard finden. Es ist die Anforderung über void*
groß genug für jeden Zeiger und die Sache über die Ausrichtung: je strenger/größer, desto weniger Bits benötigt für Zeiger auf diesen Typ. Aber ich habe noch nie von einem bestehenden System gehört, wo es solche Unterschiede gibt.
Standardese bezüglich void*
Lage zu repräsentieren char*
:
C++ 11 §3.9.2/4:
”
Ein Zeiger auf cv, Qualifizierte (3.9.3) oder cv -unqualifiziert void
kann verwendet werden , um auf Objekte unbekannten Typs zu zeigen. Ein solcher Zeiger muss in der Lage sein, jedes Objekt Zeiger zu halten.Ein Objekt des Typ cvvoid*
dort die gleichen Darstellung und Ausrichtungsanforderungen als cvchar*
Die hat “ jeder Objektzeiger ” impliziert vage, dass es verschiedene Größen von Zeigern.
Standaredese in Bezug auf die Ausrichtung von referenten:
C++ 11 §5.2.10/7:
”
ein Objektzeiger kann explizit auf ein Objekt überführt werden Zeiger eines anderen Typs. Wenn ein prvalue v
des Typs „Zeiger auf T1
“ auf den Typ umgewandelt wird, „Zeiger auf cvT2
“, ist das Ergebnis is static_cast<
cvT2*>(static_cast<
cvvoid*>(v))
wenn beide T1
und T2
sind Standard-Layout-Typen (3.9) und Die Ausrichtung Anforderungen von T2
sind nicht strenger als die von T1
, oder wenn einer der beiden Typen void
ist. Umwandeln eines prvalue vom Typ „Zeiger auf T1
“ auf den Typ „Zeiger auf T2
“ (wobei T1
und T2
Objekt sind Typen und wo die Ausrichtung Anforderungen T2
nicht strenger sind als diejenigen von T1
) und zurück in seine ursprüngliche Typ Ausbeuten der ursprüngliche Zeiger Wert. Das Ergebnis einer anderen derartigen Zeigerumwandlung ist nicht spezifiziert.
Es ’ s erwähnenswert, dass später im Standard gibt es eine gewisse Unterstützung für C-Stil-Emulation von Klassenableitung, die offenbar die “ über andere ” am Ende widerspricht:
C++ §9.2 11/20,
”
ein Zeiger auf eine struct Objekt Standard-Layout, umgewandelt in geeigneter Weise eineVerwendung 210, zeigt auf seinen ursprünglichen Member (oder wenn dieses Mitglied ein Bit-Feld ist, dann auf die Einheit, in der es sich befindet) und umgekehrt.
In diesem Fall sind die beiden Objekte notwendigerweise die gleiche Ausrichtung haben, während die vorherige zitierten Absatz nur über die Ausrichtung der Typen – gesprochen, aber deutlich die formale wenig Widerspruch ist kein praktisches Problem, wie ich es sehe.
Wenn es gibt keine solche Plattform, dann wird diese Frage schwer zu beantworten sein, da ich bezweifle, dass es Leute gibt, die getrost sagen können "Es gibt keine solche Plattform, ich kenne sie alle". Als rein hypothetisches Beispiel könnte es jedoch eine Maschine geben, die eine N-Byte-Speicherausrichtung erfordert und Ersatzbits in Zeigerwerten aufweist, und diese Bits dazu verwenden würde, zusätzliche Informationen zu codieren, die für "float" und "int" unterschiedlich sind * '. Wenn also der Standard das Ändern des Bitmusters nicht erlauben würde, wäre der Cast für diese Architektur unmöglich. – hyde