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

Определяет размер объекта или типа.

Используется, когда необходимо знать фактический размер объекта.

Содержание

Синтаксис

sizeof( тип ) (1)
sizeof выражение (2)
1) Возвращает размер в байтах представления объекта для type .
2) Возвращает размер в байтах объектного представления типа expression , если это выражение вычисляется.
type - a type-id (см. именование типов )
expression - выражение, чей приоритет операторов не ниже sizeof (например, sizeof a + b парсится как ( sizeof a ) + b вместо sizeof ( a + b ) )

Результат выражения sizeof является константным выражением типа std::size_t .

Примечания

В зависимости от архитектуры компьютера, байт может состоять из 8 или более битов, точное количество записывается в CHAR_BIT .

Следующие выражения sizeof всегда возвращают значение 1 :

  • sizeof ( char )
  • sizeof ( signed char )
  • sizeof ( unsigned char )
(начиная с C++17)
  • sizeof ( char8_t )
(начиная с C++20)

sizeof не может использоваться с функциональными типами, неполными типами или битовыми полями lvalues (до C++11) glvalues (начиная с C++11) .

При применении к ссылочному типу результатом является размер ссылочного типа.

При применении к типу класса результатом является количество байтов, занимаемых полным объектом этого класса, включая любое дополнительное выравнивание, необходимое для размещения такого объекта в массиве. Количество байтов, занимаемых потенциально перекрывающимся подобъектом , может быть меньше размера этого объекта.

Результат sizeof всегда ненулевой, даже если применяется к пустому типу класса.

При применении к выражению, sizeof не вычисляет выражение (т.е. выражение является невычисляемым операндом) (начиная с C++11) , и даже если выражение обозначает полиморфный объект, результатом является размер статического типа выражения. Преобразования lvalue-в-rvalue, массива-в-указатель или функции-в-указатель не выполняются. Материализация временного объекта , однако, (формально) выполняется для prvalue-аргументов: программа является некорректной, если аргумент не является разрушаемым. (начиная с C++17)

Ключевые слова

sizeof

Пример

Пример вывода соответствует системе с 64-битными указателями и 32-битным int (также известной как LP64 или 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(); // тип возврата - Empty, но всегда выбрасывает 1
    auto println = [](auto rem, std::size_t size) { std::cout << rem << size << '\n'; };
    println( "1) sizeof пустого класса:              ", sizeof e                     );
    println( "2) sizeof указателя:                  ", sizeof &e                    );
    println( "3) sizeof(Bit) класса:               ", sizeof(Bit)                  );
    println( "4) sizeof(int[10]) массив из 10 int: ", sizeof(int[10])              );
    println( "5) sizeof a        массив из 10 int: ", sizeof a                     );
    println( "6) длина массива из 10 int:       ", ((sizeof a) / (sizeof *a))   );
    println( "7) длина массива из 10 int (2):   ", ((sizeof a) / (sizeof a[0])) );
    println( "8) sizeof класса Derived:        ", sizeof d                     );
    println( "9) sizeof Derived через 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 функции:        ", sizeof(void()) ); // ошибка
//  println( "sizeof неполного типа: ", sizeof(int[])  ); // ошибка
//  println( "sizeof битового поля:  ", sizeof bit.bit ); // ошибка
}

Возможный вывод:

1) sizeof пустого класса:              1
2) sizeof указателя:                  8
3) sizeof(Bit) класса:               4
4) sizeof(int[10]) массив из 10 int: 40
5) sizeof a        массив из 10 int: 40
6) длина массива из 10 int:       10
7) длина массива из 10 int (2):   10
8) sizeof Derived класса:        8
9) sizeof Derived через 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

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
CWG 1553 C++11 sizeof можно было использовать с битовыми полями xvalues запрещено

Смотрите также

alignof (C++11) запрашивает требования к выравниванию типа
(оператор)
sizeof... operator (C++11) запрашивает количество элементов в pack
предоставляет интерфейс для запроса свойств всех фундаментальных числовых типов
(шаблон класса)
C documentation для sizeof