Размер массивов в MemoryLayout.size в Swift - PullRequest
2 голосов
/ 26 февраля 2020

Извините, если вопрос может быть повторен, я не смог найти его здесь и с помощью Google.

Я новичок в небезопасном Swift, и мне было интересно, почему размер массива Bools, например, 10 байт все еще 8 байтов?

Если бы я не смог сказать, что имел в виду, мне было бы интересно, если бы вы могли взглянуть на этот код:

var boolArray = [Bool]()
for _ in 1...10{
    boolArray.append(true)
}
print(MemoryLayout.size(ofValue: boolArray))

Я не знаю узнайте, почему он печатает 8, в то время как массив имеет 10 значений типа bools, которые содержат не менее 10 байтов.

Ответы [ 2 ]

4 голосов
/ 26 февраля 2020

Это потому, что Array сам по себе на самом деле ничего не хранит - внутренне они содержат ссылку на выделенную кучу память, которая действительно хранит данные.

Одна из причин, по которой это делается Способ оптимизации - позволяет использовать механизм копирования при записи. Array - это struct, поэтому это тип значения. Однако данные, которые он содержит, не нужно копировать каждый раз, когда вы копируете Array - вместо этого несколько Arrays могут указывать на одну и ту же область памяти, если они не изменяют ее.

3 голосов
/ 26 февраля 2020

Потому что результат размера функции не включает динамическое выделение или хранение вне строки. См https://developer.apple.com/documentation/swift/memorylayout/2486283-size

...