Ответ
Помимо стека (для локальных переменных и вызовов функций) и кучи (для динамически выделяемых объектов), в процессах существуют и другие сегменты памяти:
-
Сегмент кода (Text/Code Segment):
- Содержит: Исполняемый машинный код программы (инструкции).
- Особенности: Только для чтения (read-only), защищен от модификации.
-
Сегмент данных (Data Segment):
- Глобальные и статические данные (Global/Static): Хранит статические переменные (
static), глобальные переменные и константы, инициализированные при запуске. Существует всю жизнь процесса.static let appVersion = "1.0.0" // Хранится здесь - BSS (Block Started by Symbol): Подсекция для неинициализированных глобальных и статических переменных (заполняется нулями).
- Глобальные и статические данные (Global/Static): Хранит статические переменные (
-
Регистры процессора (Registers):
- Сверхбыстрая память внутри CPU для временных данных и адресов во время исполнения инструкций. Не адресуется напрямую в коде.
-
Memory-mapped I/O:
- Специальная область, где адреса памяти соответствуют не ОЗУ, а регистрам аппаратных устройств. Чтение/запись по этим адресам управляет железом.
-
Thread-local Storage (TLS):
- Память, уникальная для каждого потока. В Swift доступ через
Thread.current.threadDictionary.Thread.current.threadDictionary["requestId"] = "123"
- Память, уникальная для каждого потока. В Swift доступ через
-
Autorelease Pool:
- Не является отдельной физической областью, но это важный механизм управления временем жизни объектов. В него попадают объекты, от которых отказались с помощью
autorelease(в Objective-C/Swift с@autoreleasepool). Пул периодически дренируется, освобождая объекты.
- Не является отдельной физической областью, но это важный механизм управления временем жизни объектов. В него попадают объекты, от которых отказались с помощью
Важно: ARC в Swift управляет памятью объектов в куче. Стек используется для примитивов, структур и ссылок на объекты. Глобальные константы (let) могут размещаться в сегменте данных или (для оптимизации) непосредственно в коде.