как упаковать структуру внутри структуры

Позвольте мне уточнить, я хочу дополнить внутреннюю структуру, как мне это сделать ..? Пример-

где struct b

struct b{
  u_int32_t aa;
  u_int32_t bb;
};

struct c{
  u_int64_t cc;
};

Теперь мой компилятор выполняет заполнение 8 байтов между структурами b и c в структуре d. Итак, как мне избавиться от этого?

Надеюсь, теперь понятно. Может ли кто-нибудь дать мне ответ?

структура д{

struct b;

struct c; //I want to make this structure a padded one, how to go about it?

struct c;

}

Пожалуйста, может кто-нибудь помочь мне с этим.


person Invictus    schedule 03.08.2012    source источник
comment
возможный дубликат заполнения структуры C   -  person Timothy Jones    schedule 03.08.2012
comment
Какой компилятор вы используете? GCC использует __attribute__, а MSVC использует #pragma.   -  person Jonathon Reinhart    schedule 03.08.2012


Ответы (2)


Судя по тэгам, у вас линукс. GCC распознает следующий атрибут:

__attribute__((packed))

который вы можете написать до или после объявления структуры, чтобы удалить заполнение.

person Community    schedule 03.08.2012

На самом деле, между b и c не размещается никакого отступа.

Давайте посмотрим, почему,

Все u_int32_t составляют 32 бита => 4 байта. Теперь размер struct b будет 8 байт (4 из-за aa и 4 из-за bb). Кроме того, размер struct c также составляет 8 байт.

Таким образом, когда создается struct d, struct b и struct c размещаются последовательно друг за другом. Следующий struct c помещается сразу после предыдущего struct c.

Но после последнего struct c и закрытия struct d есть 8-байтовое дополнение. И это потому, что если в память нужно поместить несколько struct d, второй struct d в конечном итоге будет начинаться с ячейки памяти 24, а не 32 (что удобно).

Если вам нужна дополнительная информация: Утраченное искусство упаковки структур C

person Chandrahas Aroori    schedule 21.06.2017