Вы можете найти этот размер объяснителя полезным;У меня конечно есть.
Для примера в вашем комментарии , с полями типа bool
, uint32
, bool
, uint32
, uint8
, uint32
и uint8
, go использует 4-байтовое выравнивание, потому что ни один из отдельных типов не больше этого. Каждое 1-байтовое поле в этом примере заканчивается использованием четырех байтов, поскольку каждое из них находится только рядом с 4-байтовыми типами. Каждое поле заканчивается использованием четырех байтов, в общей сложности 28. Если вы переставите поля так, чтобы все четыре однобайтовых поля были в начале или в конце, все они могли быть упакованы в одно 4-байтовое окно, поэтомувся структура занимает всего 16 байтов.
Для примера в исходном сообщении go использует 8-байтовое выравнивание, поскольку для одного из полей структуры требуется как минимум восемь байтов, поэтому поля используют 16, 8 и 8байт, соответственно, в общей сложности 32. В этом случае нет необходимости переставлять поля, потому что только одно из них меньше, чем выравнивание.