Ответ
Tagged Pointer — это техника оптимизации памяти, при которой значение небольшого объекта (например, NSNumber, NSString, NSDate) хранится непосредственно в битах указателя, а не в отдельной области памяти (куче).
Как это работает:
- Указатели в 64-битных системах часто выровнены (например, по 8 байт), поэтому несколько младших бит всегда равны нулю.
- Эти «лишние» биты используются как тег (tag) для хранения типа объекта и его непосредственного значения.
Преимущества:
- Экономия памяти: Не требуется выделение отдельного блока в куче.
- Ускорение доступа: Устраняются накладные расходы на выделение/освобождение памяти и обращение к ней.
- Ускорение счетчика ссылок (ARC): Не нужен, так как объект «живет» в указателе.
Пример и проверка:
// Objective-C
NSNumber *smallNum = @42; // С высокой вероятностью будет tagged pointer
NSNumber *bigNum = @(INT_MAX); // Скорее всего, обычный объект в куче
// Проверка (функция из runtime)
BOOL isTagged = objc_isTaggedPointer((__bridge const void *)(smallNum));
// Swift
import Foundation
let smallNum: NSNumber = 42
// Косвенная проверка через описание объекта
print(smallNum) // Может показать специальное представление
Важное предупреждение: Не полагайтесь на внутреннее битовое представление Tagged Pointer — это деталь реализации, которая может меняться. Используйте только публичные API для работы с объектами.