Namespaces
Variants

sizeof operator

From cppreference.net

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

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

Содержание

Синтаксис

sizeof( тип ) (1)
sizeof выражение (2)

Обе версии возвращают значение типа size_t .

Объяснение

1) Возвращает размер в байтах представления объекта для type
2) Возвращает размер в байтах объектного представления типа expression . К expression не применяются неявные преобразования.

Примечания

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

sizeof ( char ) , sizeof ( signed char ) и sizeof ( unsigned char ) всегда возвращают 1 .

sizeof нельзя использовать с типами функций, неполными типами (включая void ), или битовыми полями lvalues.

При применении к операнду, имеющему тип структуры или объединения , результатом является общее количество байтов в таком объекте, включая внутреннее и конечное заполнение. Конечное заполнение организовано так, что если бы объект был элементом массива, требование выравнивания следующего элемента этого массива было бы удовлетворено, другими словами, sizeof ( T ) возвращает размер элемента массива T [ ] .

Если тип является VLA типом и изменение значения его выражения размера не повлияет на результат sizeof , не определено, будет ли выражение размера вычислено или нет.

(since C99)

За исключением случая, когда тип expression является VLA , (начиная с C99) expression не вычисляется, и оператор sizeof может использоваться в целочисленном constant expression .

Если тип expression является массивом переменной длины , expression вычисляется и размер массива, к которому он приводит, рассчитывается во время выполнения.

(since C99)

Количество элементов в любом массиве a включая VLA (начиная с C99) может быть определено с помощью выражения sizeof a / sizeof a [ 0 ] . Заметим, что если a имеет тип указателя (например, после преобразования массива в указатель или корректировки типа параметра функции), это выражение просто разделит количество байт в типе указателя на количество байт в указываемом типе.

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

sizeof

Пример

Пример вывода соответствует платформе с 64-битными указателями и 32-битными int

#include <stdio.h>
int main(void)
{
    short x;
    // type argument:
    printf("sizeof(float)          = %zu\n", sizeof(float));
    printf("sizeof(void(*)(void))  = %zu\n", sizeof(void(*)(void)));
    printf("sizeof(char[10])       = %zu\n", sizeof(char[10]));
//  printf("sizeof(void(void))     = %zu\n", sizeof(void(void))); // Error: function type
//  printf("sizeof(char[])         = %zu\n", sizeof(char[])); // Error: incomplete type
    // expression argument:
    printf("sizeof 'a'             = %zu\n", sizeof 'a'); // type of 'a' is int
//  printf("sizeof main            = %zu\n", sizeof main); // Error: Function type
    printf("sizeof &main           = %zu\n", sizeof &main);
    printf("sizeof \"hello\"         = %zu\n", sizeof "hello"); // type is char[6]
    printf("sizeof x               = %zu\n", sizeof x); // type of x is short
    printf("sizeof (x+1)           = %zu\n", sizeof(x + 1)); // type of x+1 is int
}

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

sizeof(float)          = 4
sizeof(void(*)(void))  = 8
sizeof(char[10])       = 10
sizeof 'a'             = 4
sizeof &main           = 8
sizeof "hello"         = 6
sizeof x               = 2
sizeof (x+1)           = 4

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 6.5.3.4 Операторы sizeof и alignof (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 6.5.3.4 Операторы sizeof и _Alignof (стр.: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 6.5.3.4 Операторы sizeof и _Alignof (стр: 90-91)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 6.5.3.4 Оператор sizeof (стр: 80-81)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 3.3.3.4 Оператор sizeof

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

Документация C++ для sizeof оператора