Без заполнения и при условии, что sizeof (int) == sizeof (char *) == sizeof (long) == 4, размер внешней структуры будет 13.
Разбить его,объединение var
перекрывает анонимную структуру с одним long
.Эта внутренняя структура больше (указатель и long), поэтому ее размер управляет размером объединения, в результате чего объединение занимает 8 байтов.Остальные члены имеют 4 байта и 1 байт, поэтому общее количество равно 13.
В любой разумной реализации с предположениями о размере, которые я сделал выше, эта структура будет дополнена границами 2 или 4 байта, добавляя вкак минимум 1 или 3 дополнительных байта к размеру.
Редактировать: В общем, поскольку размеры всех типов элементов сами по себе определены реализацией, а заполнение определяется реализацией, вам необходимочтобы обратиться к документации по вашей реализации и платформе, чтобы знать наверняка.
Реализации разрешено вставлять заполнение после практически любого элемента структуры.Разумные реализации используют минимальное заполнение, необходимое для соответствия требованиям платформы (например, процессоры RISC часто требуют, чтобы значение было выровнено по размеру этого значения) или для производительности.
Если используется структура для сопоставления полей скомпоновка значений, предполагаемая спецификацией формата файла, сопроцессором в разделяемой памяти, аппаратным устройством или любым другим подобным случаем, когда упаковка и компоновка действительно имеют значение, тогда вы можете быть обеспокоены тем, что вы тестируете во время компиляции или во время выполненияВаши предположения о макете члена верны.Это можно сделать, проверив размер всей структуры, а также смещения ее членов.
См. этот вопрос среди других для обсуждения приемов утверждения во время компиляции.