Welche Systeme gibt verwenden ungleichmäßige Zeigerdarstellung? [Duplikat]
-
27-09-2019 - |
Frage
Mögliche Duplizieren:
Gibt es irgendwelche Plattformen, auf denen Zeiger auf verschiedene Arten unterschiedliche Größen haben?
Ich habe an mehreren Stellen gelesen, dass Zeiger verschiedenen Typen unterschiedliche Darstellungen in Standard-konformen C-Implementierungen haben können. Dies ist eine Sache, die es notwendig, Gusszeigerargumente zu printf macht, z.
int foo;
printf("address is %p\n", (void *) &foo);
Ich war skeptisch, dieses und durch den C99-Standard (Dokument WG14 N1256, verfügbar unter http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf ). Bei 6.2.5.27 heißt es:
Ein Zeiger auf Lücke soll die gleiche Darstellung und Ausrichtungsanforderungen als Zeiger auf ein Zeichen-Typ. In ähnlicher Weise Zeiger auf qualifizierte oder unqualifizierte Versionen kompatible Typen sind die gleichen Darstellung und Ausrichtungsanforderungen haben. Alle Verweise auf Strukturtypen wird die gleiche Darstellung und Ausrichtungsanforderungen haben wie jeder andere. Alle Verweise auf Union-Typen haben die gleiche Darstellung haben und Ausrichtungsanforderungen als zueinander. Pointers auf andere Typen müssen nicht die gleichen Darstellung oder Ausrichtungsanforderungen.
Also, es klingt in der Tat wie eine konforme Implementierung C99 unterschiedliche Darstellungen für Zeiger verschiedenen Typen verwenden könnte.
Meine Frage lautet: , was C-Implementierungen / Architekturen gibt, die tatsächlich unterschiedliche Darstellungen für Zeiger verschiedenen Typen verwenden
Lösung
Classic Cray (weiß nicht, über ihre neuen Produkte) konnte nicht Adreßbuchstaben mit regelmäßigen Zeiger, so char*
und daher void*
verschieden waren von nativen Vektor Zeiger.
(Siehe Keiths Kommentar unten, though. Es haben in Gebrauch verschiedenen ABI gewesen, und durch die die niederwertige Adresse Bits zu den höherwertigen Ende zu drehen, haben sie manchmal die „fein“ machen und „grob“ Zeiger kompatibel zu einem gewissen Grad.)
Andere Tipps
Die wohl bekannteste ist die Real-Mode-x86-Prozessoren, die 16-Bit-Datenzeiger und 32-Bit-Funktionszeiger je nach Speichermodell (oder könnten Sie haben 32-Bit-Datenzeiger mit 16- Sie wählten haben könnte Bit-Funktionszeiger, oder etwas noch einmal anders ...).