Wie wird der Operator sizeof in c ++ implementiert?

8

Kann mir jemand auf die Implementierung von sizeof operator in C ++ hinweisen und auch eine Beschreibung seiner Implementierung.

sizeof ist einer der Operatoren, die nicht überladen werden können.

Es bedeutet also, dass wir sein Standardverhalten nicht ändern können?

    
anand 05.04.2009, 12:55
quelle

8 Antworten

22

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

  1. Größen- und Ausrichtungsdefinitionen für primitive Typen;
  2. Struktur, Größe und Ausrichtung der verschiedenen Zeiger;
  3. Regeln für das Packen von Feldern in Strukturen;
  4. Regeln über virtuelles tabellenbezogenes Zeug (esoterischer).

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.

%Vor%     
Anton Tykhyy 05.04.2009, 13:00
quelle
14

Ссылка

Im Grunde Bjarne Stroustrups C ++ FAQ :

  

Sizeof kann nicht überladen werden, weil eingebaute Operationen, wie das Inkrementieren eines Zeigers in ein Array, davon abhängen. Überlegen Sie:

%Vor%
  

Somit konnte die Größe von (X) nicht angegeben werden   neue und andere Bedeutung durch die   Programmierer ohne Grund zu verletzen   Sprachregeln.

    
Yuval Adam 05.04.2009 12:58
quelle
7

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.

    
Doug 05.04.2009 13:01
quelle
5

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.

    
anon 05.04.2009 13:06
quelle
3

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.

    
Avi 05.04.2009 13:08
quelle
1

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.

    
jwillia3 05.04.2009 14:58
quelle
1

Variable:

%Vor%

Geben Sie Folgendes ein:

%Vor%     
KedarX 07.06.2010 17:20
quelle
-1

Schauen Sie sich die Quelle für den Gnu C ++ Compiler an, um einen realistischen Blick darauf zu werfen, wie das gemacht wird.

>     
James Moore 05.04.2009 14:29
quelle

Tags und Links