рассчитать размер структуры, в которой есть структура

0

У меня есть структура:

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 или мне нужно также определить размер подструктуры? если да, то как мне это сделать?

  • 3
    Лучший способ узнать это - попробовать?
  • 0
    Это как с русскими куклами: en.wikipedia.org/wiki/Matryoshka_doll ;-)
Показать ещё 1 комментарий
Теги:
structure

2 ответа

2
Лучший ответ

Представьте себе big_struct как корзину, в которую вы положили меньшую корзину, sub_struct, внутри.

Если бы вы теперь поставили большую корзину, содержащую небольшую корзину, по шкале; вы были бы удивлены, если бы вес не включал в себя небольшую корзину, не так ли?

Это хорошая вещь sizeof ли ожидаемый..


Другими словами...

Да, sizeof дает общее количество байтов, которое принимает участие в представлении объекта его операнда; включая любое возможное дополнение.


Здесь, что C++ Standard говорит о sizeof:

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

Примечание. Оператор работает аналогично в C.


  • 0
    Спасибо, Филип, это означает, что мне не нужно явно определять sizeof (sub_struct), верно?
  • 0
    Спасибо всем за помощь
1

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. Вы можете немного прочитать об этом ниже:

  • 2
    Вы делаете много предположений о размерах типов. char всегда 1 байт, но short int не обязательно 2 байта, и между членами любой структуры или после последнего члена может быть заполнение. sizeof учитывает все это, поэтому эти предположения даже не нужны.
  • 0
    Как вы узнаете размеры этих типов в реализации OP?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню