Namensräume
Varianten
Aktionen

sizeof Operator

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

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)
1) Liefert die Größe in Bytes der Objektdarstellung des Typs.
2) Liefert die Größe in Bytes der Objektdarstellung des Typs des Ausdrucks, falls dieser Ausdruck ausgewertet wird.
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)
  • sizeof(char8_t)
(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

sizeof

[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)[bearbeiten]
sizeof... Operator (C++11) ermittelt die Anzahl der Elemente in einem Pack[bearbeiten]
bietet eine Schnittstelle zur Abfrage von Eigenschaften aller fundamentalen numerischen Typen
(Klassenschablone) [bearbeiten]
C-Dokumentation für sizeof