Ответ
Value type (структура, перечисление, кортеж) хранится непосредственно в том контексте, где он объявлен (стек, другая структура и т.д.), и занимает ровно столько памяти, сколько требуется для хранения всех его полей, с учётом выравнивания (alignment).
1. Расчёт размера:
Используйте MemoryLayout<T> для статического определения размера.
struct Point {
let x: Double // 8 байт
let y: Double // 8 байт
}
print(MemoryLayout<Point>.size) // 16 (фактический размер данных)
print(MemoryLayout<Point>.stride) // 16 (размер с учётом выравнивания)
print(MemoryLayout<Point>.alignment) // 8 (требуемое выравнивание)
2. Размеры примитивных типов (64-bit):
Int,UInt,Double: 8 байтFloat,Int32: 4 байтаBool: 1 байтCharacter: 16 байт (из-за поддержки Unicode)
3. Ключевые особенности:
- Copy-on-Write (COW): Для оптимизации такие типы, как
String,Array,Dictionary,Set, хотя и являются value type, хранят свои буферы в куче. Копирование происходит только при модификации, что экономит память. - Выравнивание: Компилятор может добавлять паддинг (padding) между полями для соблюдения alignment, что увеличивает
stride. Например, структура сBool(1 байт) иInt(8 байт) займёт не 9, а 16 байт из-за выравниванияIntна границу 8 байт.
Правило: Размер value type предсказуем и равен сумме размеров его членов + padding.