2010-02-03 17 views
8

Könnte sein, dass ich etwas Offensichtliches übersehe, aber wo sind Zeiger-Metadaten gespeichert? Zum Beispiel, wenn ich einen 32-Bit-Int-Zeiger ptr habe und ich ptr++ ausführe, weiß es 4 Bytes im Speicher zu erweitern. Wenn ich jedoch einen 64-Bit-Integer-Zeiger habe, weiß er, dass er 8 Bytes vorrücken soll. Wer also verfolgt welche Art von Zeiger ptr ist und wo ist er gespeichert? Der Einfachheit halber können Sie dies auf C++ beschränken.Wo werden Zeigermetadaten gespeichert?

+8

Kurze Antwort: Magie. Lange Antwort, es muss nicht irgendwo gespeichert werden, da der Compiler die angeforderte Zeigerarithmetik zur Kompilierzeit ausführen kann. –

+0

Alok, du solltest das als Antwort posten. Es ist exzellent. –

+0

Aus den FAQ * 'Keine Frage ist zu trivial oder zu, Neuling'. '*, Daher ist das [n00b] -Tag unnötig und auf jeden Fall falsch geschrieben. – dmckee

Antwort

18

Es wird nirgendwo per se gespeichert. Der Compiler betrachtet den Typ von ptr und wandelt die Operation ++ in ein Inkrement der korrekten Anzahl von Bytes um.

+0

Danke. Ich habe nicht einmal daran gedacht, dass es zur Kompilierzeit berechnet werden könnte. – bmalicoat

7

In der symbol table während der Compiler läuft. Nirgendwohin, während Ihr Programm ausgeführt wird, oder vielmehr ist es im unteren Code vom Compiler implizit enthalten.

2

Es wird nicht irgendwo gespeichert, es wird zur Kompilierzeit bestimmt. Nehmen Sie diesen Code als Beispiel:

int *abc = NULL; 
cout << abc + 1; /* Prints sizeof(int) */ 
cout << (void *)((char *)abc + 1); /* Prints 1. Casting it back to void * is necessary, 
      otherwise it will try to dereference it and print as a string. */ 
Verwandte Themen