Могу ли я создать структуру, где более половины пространства заполнено? - PullRequest
3 голосов
/ 01 ноября 2019

Я только начинаю изучать заполнение в структуре. Итак, правильно ли понимать, что я мог бы создать структуру только с одним символом (1 байт) и чем там заполнение 3 байта?

Ответы [ 3 ]

2 голосов
/ 02 ноября 2019

Обычно реализация C не будет заполнять структуру, содержащую один однобайтовый член. Более строгое выравнивание может быть вызвано стандартным ключевым словом _Alignas или другими способами, и в этом случае структура может содержать больше отступов, чем данных.

Однако мы можем создать нормальные структуры с большим количеством отступов, чем данных. Рассмотрим struct { char a; double b; char c; } в реализации C, где double - это восемь байтов и требует выравнивания по восемь байтов. Чтобы разложить эту структуру, реализация должна вставить (как минимум) семь байтов заполнения между a и b и должна вставить (как минимум) еще семь байт после c, чтобы размер структуры был кратен восьми байтам (который необходим для того, чтобы элементы в массиве таких структур сохранили свои требуемые выравнивания).

Эта структура имеет десять байтов данных в своих членах и четырнадцать байтов заполнения.

2 голосов
/ 01 ноября 2019

Да, в зависимости от настроек заполнения и выравнивания байтов.

0 голосов
/ 01 ноября 2019

Я думаю, что вы хотите это:

#pragma pack(push, 4)
struct {
    ...
}
#pragma pack(pop)
...