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?
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 ...
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.
Es ist auch erwähnenswert, dass es, da es ein Operator ist, ohne die Klammern auf Werte verwendet werden kann:
%Vor%Sind gleichwertig.
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
; -)
Die Größe des zurückgegebenen Typs wird zum Zeitpunkt der Kompilierung berechnet, es gibt keinen Laufzeit-Overhead
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:
Genau das, was es tun soll: fügt direkt die Konstante "die Größe der Variablen / Konstante / Typ / etc" in den Code ein
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.