sizeof
ist kein echter Operator in C ++. Es ist lediglich eine spezielle Syntax, die eine Konstante gleich der Größe des Arguments einfügt. sizeof
benötigt keine Runtime-Unterstützung oder unterstützt sie nicht.
Bearbeiten: Möchten Sie wissen, wie Sie die Größe einer Klasse / Struktur anhand ihrer Definition bestimmen können? Die Regeln dafür sind Teil des ABI , und Compiler implementieren sie nur. Grundsätzlich bestehen die Regeln aus
ABIs sind jedoch plattform- und oft herstellerspezifisch, d. h. auf x86 und (sagen wir) IA64 wird die Größe von A
darunter abweichen, da IA64 keinen nicht ausgerichteten Datenzugriff zulässt.
Im Grunde Bjarne Stroustrups C ++ FAQ :
%Vor%Sizeof kann nicht überladen werden, weil eingebaute Operationen, wie das Inkrementieren eines Zeigers in ein Array, davon abhängen. Überlegen Sie:
Somit konnte die Größe von (X) nicht angegeben werden neue und andere Bedeutung durch die Programmierer ohne Grund zu verletzen Sprachregeln.
Nein, du kannst es nicht ändern. Was erhoffen Sie sich von einer Implementierung?
Was sizeof
macht, kann nicht in C ++ geschrieben werden, indem einfachere Operationen verwendet werden. Es ist keine Funktion oder Teil eines Bibliothekskopfes wie z.B. printf
oder malloc
. Es ist innerhalb des Compilers.
Bearbeiten: Wenn der Compiler selbst in C oder C ++ geschrieben ist, dann können Sie sich die Implementierung so vorstellen:
%Vor% Beachten Sie, dass es sehr viel Pseudocode ist. Es gibt viele Dinge, die ich nicht aufgenommen habe, aber das ist die allgemeine Idee. Der Compiler tut das wahrscheinlich nicht. Es berechnet wahrscheinlich die Größe eines Typs (einschließlich einer Klasse) und speichert sie, anstatt jedesmal, wenn Sie sizeof(X)
schreiben, neu zu berechnen. Es ist auch erlaubt, z.B. Zeiger haben verschiedene Größen, je nachdem, auf was sie zeigen.
sizeof macht das zur Kompilierungszeit. Operator-Überladungen sind einfach Funktionen und tun, was sie zur Laufzeit tun. Es ist daher nicht möglich, sizeof zu überladen, auch wenn der C ++ Standard dies zulässt.
sizeof ist ein Kompilieroperator, was bedeutet, dass er zur Kompilierzeit ausgewertet wird.
Es kann nicht überladen werden, da es für alle benutzerdefinierten Typen bereits eine Bedeutung hat - die sizeof () -Klasse ist die Größe, die das von der Klasse definierte Objekt im Speicher einnimmt, und die Größe von () einer Variablen ist die Größe dass das Objekt die Variablennamen im Speicher belegen.
Wenn Sie nicht wissen müssen, wie C ++ - spezifische Größen berechnet werden (z. B. die Zuweisung für die v-Tabelle), können Sie sich den C-Compiler von Plan9 ansehen. Es ist viel einfacher als g ++ zu versuchen.
Schauen Sie sich die Quelle für den Gnu C ++ Compiler an, um einen realistischen Blick darauf zu werfen, wie das gemacht wird.
>Tags und Links c++