Размер структуры с опциями в Swift - PullRequest
2 голосов
/ 19 октября 2019

Странный результат звонка MemoryLayout<SampleStruct>.size. он возвращает 41 для следующей структуры.

struct SampleStruct {
    var tt: Int?
    var qq: Int?
    var ww: Int?
}

Это не делится на 3! Тем временем размер Int? равен 9. Как это может быть?

1 Ответ

3 голосов
/ 19 октября 2019

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.

...