sizeof() - Wieso geht das?
-
Erst mal: ich weiss wie sizeof() funktioniert
Man gibt eine Variable ein und schon erhält man die Grösse dieser Variable. Was mich jetzt aber interessiert ist, wie sizeof() das macht. Schön und gut, eine Variable hat eine bestimmte Grösse. Aber diese wird ja in der Variable selber nicht gespeichert, oder? Das heisst, eigentlich kann man anhand der Variable selbst gar nicht wissen, wie gross sie ist! Daraus folgere ich, dass irgendwo die Grösse und die Startadresse jeder Variable gespeichert sein muss. Stimmt das? Wenn ja, wo wird das gespeichert?Freue mich auf eure Antworten

MfG Glades
-
Die Variable hat einen bestimmten Typ. Den kennt der Compiler auf jeden Fall. Und der Compiler weiß selber am Besten wie das binäre Layout von diesem Typ aussieht, also auch wie viel Platz die Variablen des Typs brauchen. Damit bestimmt er schon zur Compilezeit die Größe der Variablen. sizeof angewendet auf Variablen ist also eigentlich sowas wie sizeof(typeof(var)).
-
Achso. Aber wie geht das bei dynamischen Speicherreservierungen mit new? Da weiss der Compiler ja nicht wie gross die wird, oder schon?
-
Da funktioniert ja auch sizeof nicht, oder besser gesagt nicht so, wie du es vielleicht erwartest.
char array[10]; char *pointer = new char[10]; sizeof(array) // ergibt 10, weil array den Typ char[10] hat sizeof(pointer) // ergibt 4, weil pointer den Typ char* hatedit: * vergessen
-
und vor allem ist folgendes zu beachten bei sizeof mit dynamisch reservierten Objekten:
struct Small { int i; virtual ~small() {} }; //sizeof(Small) = 4 struct Big : public Small { int many_i[100]; }; //sizeof(Big) = 101 oder so int main() { Small small; Big big; Small* pSmall_a = &big; Small* pSmall_b = new Big(); sizeof(small); //4 sizeof(big); //101 sizeof(*pSmall_a); //4 !!!! sizeof(*pSmall_b); //4 !!!! delete pSmall_b; }kurz: sizeof beachtet nur den statischen Typ des Arguments. Und der ist bei den Pointern der statische Typ des Pointee, also hier immer Small, weil beide Pointer als Small* deklariert wurden. Es gilt nicht der dynamische Typ.
-
char pointer = new char[10]; sizeof(pointer) // ergibt 4, weil pointer den Typ char* hat[/quote]
Dann musst ihn aber auch so initialisieren
char *pointer = new char[10];