У меня есть структура:
struct sub_struct
{
short int alpha; //2 bytes
short int beta;
short int gamma;
}
struct big_struct
{
char movie;
char songs;
short int release;
sub_struct temp_struct[ 4 ];
}
Где-то в коде я должен проверить sizeof struct, так что я определяю в заголовке что-то вроде:
const int LEN_BIG_STRUCT = sizeof( big_struct );
Теперь мой вопрос: будет ли LEN_BIG_STRUCT
включать размер sub_struct или мне нужно также определить размер подструктуры? если да, то как мне это сделать?
Представьте себе big_struct
как корзину, в которую вы положили меньшую корзину, sub_struct
, внутри.
Если бы вы теперь поставили большую корзину, содержащую небольшую корзину, по шкале; вы были бы удивлены, если бы вес не включал в себя небольшую корзину, не так ли?
Это хорошая вещь sizeof
ли ожидаемый..
Да, sizeof
дает общее количество байтов, которое принимает участие в представлении объекта его операнда; включая любое возможное дополнение.
Здесь, что C++ Standard говорит о sizeof
:
При применении к классу результатом является количество байтов в объекте этого класса, включая любое дополнение, необходимое для размещения объектов этого типа в массиве.
Примечание. Оператор работает аналогично в C.
sizeof(x)
возвращает общее количество байтов переменной или типу x
.
В твоем случае:
small_struct
: всего 6 байтов (по 2 от каждого short int
).big_struct
: 2 char
и 1 short
, а также массив small_struct
который составляет 24 байта (4 элемента * 6 байтов). Поэтому sizeof(big_struct)
возвращает 28
как общее количество байтов.
Чтобы ответить на ваш вопрос, вам не нужно определять размер small_struct
потому что sizeof()
добавляет в свой ответ все байты, включенные в структуру, такие как Филипп Розен.
Примечание: как указано ниже, 28
байтов для big_struct
не универсальны для всех систем. Это связано с заполнением данных в C. Вы можете немного прочитать об этом ниже:
char
всегда 1 байт, но short int
не обязательно 2 байта, и между членами любой структуры или после последнего члена может быть заполнение. sizeof
учитывает все это, поэтому эти предположения даже не нужны.