sizeof Operator
Ermittelt die Größe des Objekts oder Typs.
Wird verwendet, wenn die tatsächliche Größe des Objekts bekannt sein muss.
Inhalt |
[bearbeiten] Syntax
sizeof( Typ ) |
(1) | ||||||||
sizeof Ausdruck |
(2) | ||||||||
| type | - | ein Typ-Bezeichner (siehe Typ-Benennung) |
| expression | - | ein Ausdruck, dessen Operatorrangfolge nicht niedriger ist als die von sizeof (z.B. wird sizeof a + b als (sizeof a) + b und nicht als sizeof (a + b) interpretiert) |
Das Ergebnis eines sizeof-Ausdrucks ist ein Konstanten-Ausdruck vom Typ std::size_t.
[bearbeiten] Anmerkungen
Abhängig von der Computerarchitektur kann ein Byte aus 8 oder mehr Bits bestehen. Die genaue Anzahl wird in CHAR_BIT aufgezeichnet.
Die folgenden sizeof-Ausdrücke ergeben immer 1
- sizeof(char)
- sizeof(signed char)
- sizeof(unsigned char)
|
(seit C++17) |
|
(seit C++20) |
sizeof kann nicht mit Funktionstypen, unvollständigen Typen oder Bitfeld-L-Werten(bis C++11)GL-Werten(seit C++11) verwendet werden.
Bei Anwendung auf einen Referenztyp ist das Ergebnis die Größe des referenzierten Typs.
Bei Anwendung auf einen Klassentyp ist das Ergebnis die Anzahl der Bytes, die ein vollständiges Objekt dieser Klasse belegt, einschließlich etwaiger zusätzlicher Auffüllung, die erforderlich ist, um ein solches Objekt in einem Array zu platzieren. Die Anzahl der Bytes, die ein potenziell überlappendes Unterobjekt belegt, kann geringer sein als die Größe dieses Objekts.
Das Ergebnis von sizeof ist immer ungleich Null, auch wenn es auf einen leeren Klassentyp angewendet wird.
Bei Anwendung auf einen Ausdruck wertet sizeof den Ausdruck nicht aus (d.h. der Ausdruck ist ein nicht ausgewerteter Operand)(seit C++11). Und selbst wenn der Ausdruck ein polymorphes Objekt bezeichnet, ist das Ergebnis die Größe des statischen Typs des Ausdrucks. Lvalue-zu-Rvalue-, Array-zu-Pointer- oder Funktions-zu-Pointer-Konvertierungen werden nicht durchgeführt. Eine temporäre Materialisierung wird jedoch (formal) für PRvalue-Argumente durchgeführt: Das Programm ist schlecht formuliert, wenn das Argument nicht zerstörbar ist.(seit C++17)
[bearbeiten] Schlüsselwörter
[bearbeiten] Beispiel
Die Beispielausgabe entspricht einem System mit 64-Bit-Pointern und 32-Bit-int (auch bekannt als LP64 oder LLP64).
#include <cstdlib> #include <iostream> struct Empty { }; struct Base { int a; }; struct Derived : Base { int b; }; struct Bit { unsigned bit: 1; }; struct CharChar { char c; char c2; }; struct CharCharInt { char c; char c2; int i; }; struct IntCharChar { int i; char c; char c2; }; struct CharIntChar { char c; int i; char c2; }; struct CharShortChar { char c; short s; char c2; }; int main() { Empty e; Derived d; Base& b = d; [[maybe_unused]] Bit bit; int a[10]; auto f = [&]() { return sizeof(int[10]) == sizeof a ? throw 1 : e; }; // f(); // the return type is Empty, but always throws 1 auto println = [](auto rem, std::size_t size) { std::cout << rem << size << '\n'; }; println( "1) sizeof empty class: ", sizeof e ); println( "2) sizeof pointer: ", sizeof &e ); println( "3) sizeof(Bit) class: ", sizeof(Bit) ); println( "4) sizeof(int[10]) array of 10 int: ", sizeof(int[10]) ); println( "5) sizeof a array of 10 int: ", sizeof a ); println( "6) length of array of 10 int: ", ((sizeof a) / (sizeof *a)) ); println( "7) length of array of 10 int (2): ", ((sizeof a) / (sizeof a[0])) ); println( "8) sizeof the Derived class: ", sizeof d ); println( "9) sizeof the Derived through Base: ", sizeof b ); println( "A) sizeof(unsigned): ", sizeof(unsigned) ); println( "B) sizeof(int): ", sizeof(int) ); println( "C) sizeof(short): ", sizeof(short) ); println( "D) sizeof(char): ", sizeof(char) ); println( "E) sizeof(CharChar): ", sizeof(CharChar) ); println( "F) sizeof(CharCharInt): ", sizeof(CharCharInt) ); println( "G) sizeof(IntCharChar): ", sizeof(IntCharChar) ); println( "H) sizeof(CharIntChar): ", sizeof(CharIntChar) ); println( "I) sizeof(CharShortChar): ", sizeof(CharShortChar) ); println( "J) sizeof f(): ", sizeof f() ); println( "K) sizeof Base::a: ", sizeof Base::a ); // println( "sizeof function: ", sizeof(void()) ); // error // println( "sizeof incomplete type: ", sizeof(int[]) ); // error // println( "sizeof bit-field: ", sizeof bit.bit ); // error }
Mögliche Ausgabe
1) sizeof empty class: 1 2) sizeof pointer: 8 3) sizeof(Bit) class: 4 4) sizeof(int[10]) array of 10 int: 40 5) sizeof a array of 10 int: 40 6) length of array of 10 int: 10 7) length of array of 10 int (2): 10 8) sizeof the Derived class: 8 9) sizeof the Derived through Base: 4 A) sizeof(unsigned): 4 B) sizeof(int): 4 C) sizeof(short): 2 D) sizeof(char): 1 E) sizeof(CharChar): 2 F) sizeof(CharCharInt): 8 G) sizeof(IntCharChar): 8 H) sizeof(CharIntChar): 12 I) sizeof(CharShortChar): 6 J) sizeof f(): 1 K) sizeof Base::a: 4
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| CWG 1553 | C++11 | sizeof könnte mit Bitfeld-Xvalues verwendet werden |
verboten |
[bearbeiten] Siehe auch
alignof (C++11) |
fragt nach Ausrichtungsanforderungen eines Typs (Operator) |
sizeof... Operator (C++11) |
ermittelt die Anzahl der Elemente in einem Pack |
| bietet eine Schnittstelle zur Abfrage von Eigenschaften aller fundamentalen numerischen Typen (Klassenschablone) | |
| C-Dokumentation für sizeof
| |