sizeof оператор
Запрашивает размер объекта или типа.
Используется, когда необходимо узнать фактический размер объекта.
Синтаксис
sizeof( тип ) | (1) | |
sizeof выражение | (2) |
| тип | - | идентификатор типа (см. именование типов) |
| выражение | - | выражение, приоритет оператора которого не ниже 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 нельзя применять к функциональным типам, неполным типам или битовым полям lvalue(до C++11)glvalue(начиная с C++11).
При применении к ссылочному типу результатом является размер типа, на который ссылаются.
При применении к типу класса результатом является количество байтов, занимаемых полным объектом этого класса, включая дополнительное заполнение, необходимое для размещения такого объекта в массиве. Количество байтов, занимаемых потенциально перекрывающимся подобъектом, может быть меньше размера этого объекта.
Результат sizeof всегда отличен от нуля, даже если оператор применяется к типу пустого класса.
При применении к выражению sizeof не вычисляет это выражение (то есть выражение является невычисляемым операндом)(начиная с C++11); даже если выражение обозначает полиморфный объект, результатом является размер статического типа выражения. Преобразования lvalue-to-rvalue, array-to-pointer и function-to-pointer не выполняются. Однако для аргументов-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(); // 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
}
Возможный вывод:
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
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| DR | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| CWG 1553 | C++11 |
sizeof можно было использовать с xvalue битового поля | запрещено |
См. также
alignof (C++11) | запрашивает требования к выравниванию типа (оператор) |
sizeof... оператор (C++11) | запрашивает количество элементов в пакете |
| предоставляет интерфейс для запроса свойств всех фундаментальных числовых типов (шаблон класса) |
|
Документация по C для sizeof |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/sizeof