Int?
aka Optional<Int>
является типом enum
и требует 9 байтов: 8 байтов для целого числа (если мы на 64-битной платформе) плюс один байт для распознавателя регистра.
Кроме того, каждое целое число выровнено в памяти по своей естественной (8-байтовой) границе путем вставки байтов заполнения.
Таким образом, ваша структура будет выглядеть в памяти следующим образом:
i1 i1 i1 i1 i1 i1 i1 i1 // 8 bytes for the first integer
c1 p1 p1 p1 p1 p1 p1 p1 // 1 byte for the first case discriminator,
// ... and 7 padding bytes
i2 i2 i2 i2 i2 i2 i2 i2 // 8 bytes for the second integer
c2 p2 p2 p2 p2 p2 p2 p2 // 1 byte for the second case discriminator
// ... and 7 padding bytes
i3 i3 i3 i3 i3 i3 i3 i3 // 8 bytes for the third integer
c3 // 1 byte for the third case discriminator
Это составляет всего 41 байт.
Если SampleStruct
значения хранятся в массиве непрерывнозатем между элементами вставляется дополнительный отступ, чтобы каждое значение начиналось с 8-байтовой границы. Это дополнительное заполнение учитывается шагом :
print(MemoryLayout<SampleStruct>.size) // 41
print(MemoryLayout<SampleStruct>.stride) // 48
Подробные сведения можно найти в документе Type Layout в документации Swift.