Извините, если вопрос может повторяться, я не смог найти его ни здесь, ни с помощью Google.
Я новичок в небезопасном Swift, и мне было интересно, почему размер массива Bools, который составляет, например, 10 байтов, по-прежнему составляет 8 байтов?
Если бы я не мог сказать, что я имел в виду, мне было бы интересно, не могли бы вы взглянуть на этот код:
var boolArray = [Bool]()
for _ in 1...10{
boolArray.append(true)
}
print(MemoryLayout.size(ofValue: boolArray))
Я не понимаю, почему он печатает 8, в то время как массив имеет 10 логических значений, которые содержат как минимум 10 байтов.
Array(repeating: true, count: 10)
Или, если вы имеете дело с классами и хотите 10 различных объектов:(1...10).map { _ in YourClass() }
- person Alexander   schedule 26.02.2020Array<Bool>
(в настоящее время) не занимается упаковкой битов. Он использует 1 байтBool
s. - person Alexander   schedule 26.02.2020Bool
в индексе 59 (0b111011
в двоичном формате), вы смотрите на 7-й байт (0b111
). Допустим, значение этого байта было0b11111111
(все верно). Нам важен бит 3 (0b011
), поэтому мы маскируем0b1111111
, объединяя его с маской0b00000100
. Результат0b00000100
, что означает, что был установлен 3-й бит. - person Alexander   schedule 26.02.20200b11111011
, после маскирования его с помощью0b00000100
мы получили бы0x00000000
, что означает, что 3-й бит был выключен. - person Alexander   schedule 26.02.2020Optional<Bool>
— это всего лишь 1 байт. Он кодируетfalse
как0b00
,true
как0b01
иnil
как0b10
.. Просто так получилось, что не дляArray<Bool>
. Кроме того, битовые поля по-прежнему чрезвычайно важны, даже при современных объемах памяти. Например, они повсеместно используются в игровых движках для определения того, какие слои могут физически взаимодействовать с какими другими слоями. . - person Alexander   schedule 26.02.2020