sizeof
operator
Определяет размер объекта или типа.
Используется, когда необходимо знать фактический размер объекта.
Содержание |
Синтаксис
sizeof(
тип
)
|
(1) | ||||||||
sizeof
выражение
|
(2) | ||||||||
| 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) |
|
(начиная с C++20) |
sizeof
не может использоваться с функциональными типами, неполными типами или битовыми полями
lvalues
(до C++11)
glvalues
(начиная с C++11)
.
При применении к ссылочному типу результатом является размер ссылочного типа.
При применении к типу класса результатом является количество байтов, занимаемых полным объектом этого класса, включая любое дополнительное выравнивание, необходимое для размещения такого объекта в массиве. Количество байтов, занимаемых потенциально перекрывающимся подобъектом , может быть меньше размера этого объекта.
Результат
sizeof
всегда ненулевой, даже если применяется к пустому типу класса.
При применении к выражению,
sizeof
не вычисляет выражение
(т.е. выражение является невычисляемым операндом)
(начиная с C++11)
, и даже если выражение обозначает полиморфный объект, результатом является размер статического типа выражения. Преобразования lvalue-в-rvalue, массива-в-указатель или функции-в-указатель не выполняются.
Материализация временного объекта
, однако, (формально) выполняется для prvalue-аргументов: программа является некорректной, если аргумент не является разрушаемым.
(начиная с C++17)
Ключевые слова
Пример
Пример вывода соответствует системе с 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
|
|