Например, у меня есть класс
,
class naive { public: char a; long long b; char c; int d; };
и согласно моей программе тестирования, от a
до d
строятся один за другим , например,
a------- bbbbbbbb c---dddd
-
означает неиспользуемый.
Почему C ++ не делает его более жестким, например
ac--dddd bbbbbbbb
Стандарт и класс требуют, чтобы члены сохранялись в памяти в том же порядке, в котором они были объявлены. Так что в вашем примере, d
не могло бы появиться раньше b
.
Кроме того, большинство архитектур предпочитают, чтобы многобайтовые типы были выровнены на 4- или 8-байтовых границах. Поэтому все, что может сделать компилятор, - это оставить пустые байты заполнения между членами класса.
Вы можете свести к минимуму заполнение, переупорядочив элементы самостоятельно, в порядке увеличения или уменьшения размера. Или ваш компилятор может иметь опцию #pragma pack
или что-то подобное, что будет стремиться минимизировать заполнение за счет возможного снижения производительности и размера кода. Прочитайте документы для своего компилятора.