Смещение Swift (of :) для UInt8 имеет смещение 2 байта - PullRequest
0 голосов
/ 04 октября 2018

Почему переменная UInt8 в быстрой структуре показывает смещение 2?Однако структура только UInt8s показывает смещение 1?

struct Test {
    let a: UInt8
    let b: UInt16
}

MemoryLayout<Test>.offset(of: \Test.a) // 0
MemoryLayout<Test>.offset(of: \Test.b) // 2 (not 1)

struct Test2 {
    let a: UInt8
    let b: UInt8
    let c: UInt8
}

MemoryLayout<Test2>.offset(of: \Test2.a) // 0
MemoryLayout<Test2>.offset(of: \Test2.b) // 1
MemoryLayout<Test2>.offset(of: \Test2.c) // 2

1 Ответ

0 голосов
/ 04 октября 2018

Это связано с тем, как Swift выравнивает ваши свойства в памяти.Для вашей первой структуры alignment равен 2, тогда как вторая структура имеет выравнивание 1.

Ваши свойства в Test не сохраняются в памяти, упакованной вместе, как показано ниже:

x y y

где x представляет байт для a, а y представляет байт для b.

Это выглядит примерно так:

x   y y

Примечаниезаполнение после x.

Смысл, который я здесь пытаюсь подчеркнуть, заключается в том, что Swift разделяет часть памяти на «кусочки», чтобы поместить свойства ваших структур. Эти равные кусочки должны быть в состояниисодержать все ваши свойства.Вот почему в Test память должна быть разрезана на куски по 2 байта, чтобы уместиться в UInt16.

В Test2, однако, разрезая память на кусочки по 1 байтдостаточно, чтобы содержать UInt8 с.

Это число "Сколько байт на фрагмент" является alignment.

. Почему Swift сокращает память таким образом, прочитайте это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...