Was ist der Mechanismus von sizeof () in C / C ++?

8

Scheint sizeof keine echte Funktion zu sein?

zum Beispiel, wenn Sie so schreiben:

%Vor%

Sie können eine Ausgabe wie folgt erhalten:

%Vor%

Und wenn Sie sich in den Assembler-Code vertiefen, werden Sie so etwas finden:

%Vor%

Also, der Compiler setzt direkt die Konstante "4" als Parameter von printf add call it. Was macht sizeof dann?

    
ibread 17.10.2009, 09:41
quelle

9 Antworten

34

Sie wissen, es gibt einen Grund, warum es Standarddokumente (3,8 MB PDF) gibt ) ; C99, Abschnitt 6.5.3.4, §2:

  

Der Operator sizeof gibt die Größe an   (in Bytes) seines Operanden, der   sei ein Ausdruck oder die Klammer   Name eines Typs. Die Größe ist festgelegt   vom Typ des Operanden. Das   Ergebnis ist eine ganze Zahl. Wenn der Typ von   Der Operand ist ein Array variabler Länge   Typ, der Operand wird ausgewertet;   Andernfalls ist der Operand nicht   ausgewertet und das Ergebnis ist eine ganze Zahl   Konstante .

Als Antwort auf den Kommentar von ibread folgt hier ein Beispiel für den C99-Fall mit variabler Länge:

%Vor%

Die Größe von foo ist zur Kompilierzeit nicht mehr bekannt und muss zur Laufzeit ermittelt werden. Die generierte Assembly sieht ziemlich komisch aus, also frag mich nicht nach Implementierungsdetails ...

    
Christoph 17.10.2009, 09:46
quelle
16

sizeof ist ein Operator, keine Funktion.

Es wird normalerweise als Kompilierzeit ausgewertet - die Ausnahme ist, wenn es bei Arrays variabler Länge im C99-Stil verwendet wird.

In Ihrem Beispiel wird sizeof(int) ausgewertet, was natürlich zur Kompilierzeit bekannt ist, daher wird der Code durch eine Konstante ersetzt und daher existiert die ++ nicht zur Laufzeit, um ausgeführt zu werden.

%Vor%

Es ist auch erwähnenswert, dass es, da es ein Operator ist, ohne die Klammern auf Werte verwendet werden kann:

%Vor%

Sind gleichwertig.

    
John Carter 17.10.2009 10:21
quelle
8

Sizeof analysiert den übergebenen Ausdruck, um seinen Typ zu finden. Es gibt dann die Größe des Typs zurück.

Da die Größe eines Typs zur Kompilierzeit immer bekannt ist, wird er als Konstante in den Maschinencode eingefügt.

    
Timbo 17.10.2009 09:43
quelle
2

Es wird zur Kompilierzeit durch die Konstante (4 in Ihrem Fall) ersetzt. Weil es 4 Bytes dauert, um einen Int auf Ihrer Plattform zu halten.

Und dein Code wird nicht kompiliert, anstatt dir irgendwelche Ausgaben zu geben ;-) Wegen sizoef ; -)

    
Michael Krelin - hacker 17.10.2009 09:44
quelle
1

Die Größe des zurückgegebenen Typs wird zum Zeitpunkt der Kompilierung berechnet, es gibt keinen Laufzeit-Overhead

    
Chris Bednarski 17.10.2009 09:45
quelle
1

In C ++ berechnet sizeof() die Größe des Typs des Ausdrucks und ersetzt den gesamten " sizeof() Funktionsaufruf" durch eine Konstante während der Kompilierung.

Der Ausdruck innerhalb von sizeof() wird niemals während der Programmausführung ausgewertet. Und es kann nicht einmal ein Typname sein. Überprüfen Sie diese Beispiele:

%Vor%     
Pavel Shved 17.10.2009 09:53
quelle
0

Genau das, was es tun soll: fügt direkt die Konstante "die Größe der Variablen / Konstante / Typ / etc" in den Code ein

    
Valentin Golev 17.10.2009 09:44
quelle
0

sizeof () liefert die Größe in Bytes von allem, was Sie als Argument übergeben. In einer 32-Bit-Architektur würde sizeof (int) 4 zurückgeben, während sizeof (char) 1 zurückliefern würde.

    
arclight 17.10.2009 09:45
quelle
0

Sie haben es selbst gesagt: 'sizeof' ist keine Funktion. Es ist ein eingebauter Operator mit spezieller Syntax und Semantik (siehe vorherige Antworten). Um sich besser daran zu erinnern, dass es sich nicht um eine Funktion handelt, möchten Sie vielleicht die Gewohnheit weglassen, überflüssige Klammern zu verwenden, und bevorzugen die "klammerlose" 'Größe von' mit Ausdrücken wie im folgenden Beispiel

%Vor%

Dies entspricht genau Ihrer ursprünglichen Version.

    
AnT 17.10.2009 15:18
quelle

Tags und Links