Zeiger immer gleich Groß egal welcher Typ?
-
Vertexwahn schrieb:
weißt du zufällig unter welche punkt das in der ISO norm steht?
6.5.3.4, Absatz 4: The value of the result is implementation-defined, ...
-
gilt gleiches für C++?
-
Ja.
-
Dass das Ergebnis von sizeof implementationsdefiniert ist, beantwortet aber glaub ich nicht die ursprüngliche Frage
-
Doch, damit kann es Implementationen geben, auf denen Zeiger unterschiedliche Grösse haben. Zumindest hab ich keine weiteren Einschränkungen gefunden.
-
Nach dergleichen Logik könntest du damit begründen, dass verschiedene char-Typen unterschiedliche Größen haben können. Der von dir gepostete Absatz ist in diesem Kontext komplett irrelevant.
-
Pointer sind doch gelegentlich unterschiedlich lang!
In einem Prozessor, der zwar x Megabyte adressieren könnte, aber von Haus aus nur mit 2 kByte Speicher daherkommt, ist es Blödsinn
, Adressen mit 4 Bytes (far) zu veranschlagen, es tun dabei auch zwei (near). Weiterhin finden Zugriffe innerhalb einer Speicherseite mit weniger Taktzyklen statt
.
Im Allgemeinen erledigen das die Compiler in aller Stille nach einem eigenen Ruleset und casten auch selbst von near nach far und umgedreht
. Nur bei manchen Konstrukten fällt er auf die Nase
und dann muß man "von Hand" mit expliziten Modifyern nachhelfen.
Tatsächlich ergibt die sizeof()- Nachfrage unterschiedliche Größen für Pointer aus.
Ein Pointer auf eine Funktion ist bei mir als Standard zwei Bytes groß, der Pointer auf eine Struct z.B. 4 Byte groß.Ja, so ist das mit den Pointern ...
-
Bashar schrieb:
Nach dergleichen Logik könntest du damit begründen, dass verschiedene char-Typen unterschiedliche Größen haben können.
Könnte man, wenn da nicht 6.2.5,5 wäre. (Warum steht in dem Satz eigentlich nichts von unsigned char?)
Der von dir gepostete Absatz ist in diesem Kontext komplett irrelevant.
Er ist relevant, da für Zeiger kein Äquivalent zu 6.2.5,5 existiert.
-
SG1 schrieb:
Er ist relevant, da für Zeiger kein Äquivalent zu 6.2.5,5 existiert.
Dann ist die Abwesenheit von diesem Äquivalent relevant. 6.5.3.4 ist nach wie vor irrelevant.
-
Bashar schrieb:
SG1 schrieb:
Er ist relevant, da für Zeiger kein Äquivalent zu 6.2.5,5 existiert.
Dann ist die Abwesenheit von diesem Äquivalent relevant. 6.5.3.4 ist nach wie vor irrelevant.
Diese Art der Diskussion ist irrelevant
Wie SG1 schon erwähnte, war auch der PC vor noch nicht allzulanger Zeit auf ein Seg:Off- Memory Model angewiesen.
"Schräge" Memory Models sind keine Ausnahme, sondern die Regel!!
Wie will man denn sonst die x-verschiedenen Memory Models unter ANSI-C vereinigen? Die Mehrzahl der Programme auf der Welt läuft ja nicht auf PCs, sondern in Videorecordern, Waschmaschinen, Handies, in ESP- und ABS und was weiß ich noch wo. Damit regiert nicht der X86, sondern regieren die 8051er, MSP430, ARM, PICs, AVRs und Konsorten die C-Welt.
Der Vielzahl der dortigen Memory Models trägt die Spezifikation Rechnung, indem die Pointerlänge implementationsspezifisch ist, jedoch das casting nichttypisierter und typisierter Pointer gewährleistet sein muß
.
Nichts anderes macht Sinn
und nichts anderes sagt die Spezifikation. Und wer meint, sich auf eine eindeutige Pointergröße verlassen zu müssen, produziert schlichtwegs nichtportablen Code.
Und wenn wir schon bei Sinnlosdiskussionen sind, könnten wir auch noch des Kaisers Bart diskutieren ...
-
pointercrash() schrieb:
Diese Art der Diskussion ist irrelevant
Warum führst du sie dann weiter?
Wie SG1 schon erwähnte, war auch der PC vor noch nicht allzulanger Zeit auf ein Seg:Off- Memory Model angewiesen.
Sag bloß. Compiler für segmentierte Architekturen (jedenfalls die 2 die ich kenne) lösen das Problem aber durch nichtportable Erweiterungen. Kennst du eine Architektur, die für diese Diskussion relevant ist?
Dass Pointertypen unterschiedlich groß sein können, schlägt sich im Standard implizit in mehreren Dingen nieder: 1) darin, dass nirgendwo gesagt wird dass Pointertypen gleich groß zu sein haben 2) dass gesagt wird, dass void* und char* identische Repräsentation haben müssen 3) dass Zeiger auf verschiedene Strukturtypen gleich repräsentiert sein müssen.
Dass das Ergebnis von sizeof implementationsdefiniert ist, hat damit zwar entfernt zu tun, aber stellt keinesfalls die Stelle im Standard dar, an der das definiert wird.
-
... und ich wollt', der Thread wär' tot. (Sorry, daß ich ihn nochmal aufleben lasse).
Eingangsfrage war, ob auch unterschiedlich typisierte Pointer immer gleich lang sind und ihr hakelt's euch darum, wo's genau steht.
Die Antwort lautet "Nein"
, betrifft jede Implementation und ergibt sich sowohl aus der Praxis als auch aus der ANSI- Spec.
Und was nichtkonforme Erweiterungen anbelangt - dazu gibt's #define und #ifdef, die mit einem einzigen "//" "rauszuschmeißen". Alles Standard.
-
Richtig, die Eingangsfrage ist schon lange geklärt.