Namespaces
Variants

sizeof operator

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Ermittelt die Größe des Objekts oder Typs.

Wird verwendet, wenn die tatsächliche Größe des Objekts bekannt sein muss.

Inhaltsverzeichnis

Syntax

sizeof( Typ ) (1)
sizeof Ausdruck (2)
1) Liefert die Größe in Bytes der Objektdarstellung des type .
2) Liefert die Größe in Bytes der Objektdarstellung des Typs von expression , falls dieser Ausdruck ausgewertet wird.
type - ein type-id (siehe Typbenennung )
expression - ein Ausdruck, dessen Operatorpräzedenz nicht niedriger als sizeof ist (z.B. wird sizeof a + b geparst als ( sizeof a ) + b anstatt sizeof ( a + b ) )

Das Ergebnis eines sizeof -Ausdrucks ist eine konstante Expression vom Typ std::size_t .

Hinweise

Abhängig von der Computerarchitektur kann ein Byte aus 8 oder mehr Bits bestehen, wobei die genaue Anzahl in CHAR_BIT festgehalten ist.

Die folgenden sizeof Ausdrücke ergeben immer 1 :

  • sizeof ( char )
  • sizeof ( signed char )
  • sizeof ( unsigned char )
*Hinweis: Da der gesamte Text innerhalb von ` ` Tags liegt (was als Codebereich betrachtet wird) und gemäß den Anweisungen Code nicht übersetzt werden soll, bleibt der gesamte Inhalt unverändert.*
(seit C++17)
  • sizeof ( char8_t )
(seit C++20)

sizeof kann nicht mit Funktionstypen, unvollständigen Typen oder Bitfeld- Lvalues (bis C++11) Glvalues (seit C++11) verwendet werden.

Bei Anwendung auf einen Referenztyp ist das Ergebnis die Größe des referenzierten Typs.

Wenn auf einen Klassentyp angewendet, ist das Ergebnis die Anzahl der Bytes, die von einem vollständigen Objekt dieser Klasse belegt werden, einschließlich jeglicher zusätzlicher Auffüllung, die erforderlich ist, um ein solches Objekt in einem Array zu platzieren. Die Anzahl der Bytes, die von einem potenziell überlappenden Unterobjekt belegt werden, kann geringer sein als die Größe dieses Objekts.

Das Ergebnis von sizeof ist immer ungleich null, selbst wenn es auf einen leeren Klassentyp angewendet wird.

Wenn auf einen Ausdruck angewendet, sizeof wertet 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-Zeiger- oder Funktion-zu-Zeiger-Konvertierungen werden nicht durchgeführt. Temporäre Materialisierung wird jedoch (formal) für Prvalue-Argumente durchgeführt: Das Programm ist fehlerhaft, wenn das Argument nicht zerstörbar ist. (seit C++17)

Schlüsselwörter

sizeof

Beispiel

Die Beispielausgabe entspricht einem System mit 64-Bit-Zeigern 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(); // der Rückgabetyp ist Empty, wirft aber immer 1
    auto println = [](auto rem, std::size_t size) { std::cout << rem << size << '\n'; };
    println( "1) sizeof leere Klasse:              ", sizeof e                     );
    println( "2) sizeof Zeiger:                    ", sizeof &e                    );
    println( "3) sizeof(Bit) Klasse:               ", sizeof(Bit)                  );
    println( "4) sizeof(int[10]) Array von 10 int: ", sizeof(int[10])              );
    println( "5) sizeof a        Array von 10 int: ", sizeof a                     );
    println( "6) Länge des Arrays von 10 int:      ", ((sizeof a) / (sizeof *a))   );
    println( "7) Länge des Arrays von 10 int (2):  ", ((sizeof a) / (sizeof a[0])) );
    println( "8) sizeof der abgeleiteten Klasse:   ", sizeof d                     );
    println( "9) sizeof abgeleitet durch Basis:    ", 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 Funktion:        ", sizeof(void()) ); // Fehler
//  println( "sizeof unvollständiger Typ: ", sizeof(int[])  ); // Fehler
//  println( "sizeof Bitfeld:        ", sizeof bit.bit ); // Fehler
}

Mögliche Ausgabe:

1) sizeof leere Klasse:              1
2) sizeof Zeiger:                    8
3) sizeof(Bit) Klasse:               4
4) sizeof(int[10]) Array von 10 int: 40
5) sizeof a        Array von 10 int: 40
6) Länge des Arrays von 10 int:      10
7) Länge des Arrays von 10 int (2):  10
8) sizeof der abgeleiteten Klasse:   8
9) sizeof der abgeleiteten Klasse über Basis: 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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 1553 C++11 sizeof konnte mit Bitfeld-XValues verwendet werden verboten

Siehe auch

alignof (C++11) fragt die Ausrichtungsanforderungen eines Typs ab
(Operator)
sizeof... operator (C++11) fragt die Anzahl der Elemente in einem Pack ab
bietet eine Schnittstelle zur Abfrage von Eigenschaften aller grundlegenden numerischen Typen
(Klassentemplate)
C-Dokumentation für sizeof