2016-10-23 1 views
0

Когда я прочитал ,inline bool objc_object :: isTaggedPointer(); Как работает эта функция?

Я не могу понять, как работает эта функция.

inline bool 
objc_object::isTaggedPointer() 
{ 
    return ((uintptr_t)this & TAG_MASK); 
} 

Ниже приведены как TAG_MASK определяют:

#if SUPPORT_MSB_TAGGED_POINTERS 
# define TAG_MASK (1ULL<<63) 
# define TAG_SLOT_SHIFT 60 
# define TAG_PAYLOAD_LSHIFT 4 
# define TAG_PAYLOAD_RSHIFT 4 
#else 
# define TAG_MASK 1 
# define TAG_SLOT_SHIFT 0 
# define TAG_PAYLOAD_LSHIFT 0 
# define TAG_PAYLOAD_RSHIFT 4 
#endif 

Я знаю, что если TAG_MASK равен 1, то функция возвращает false.But Когда функция возвращает истину, и поэтому эта функция может судить результат. Спасибо!

ответ

0

Указатель с меткой - это способ создания объекта без выделения.

Таким образом, среда выполнения должна быть способна определить, является ли объект ссылкой на кусок выделенной памяти или если указатель объекта действительно является данным.

Он делает это, устанавливая один бит в «указателе» на 1. бит, который обычно всегда равен 0 для регулярных распределений. Существует два режима; «самый значительный бит» и «младший бит».

В модели LSB используется первый бит. При распределении памяти все распределения выравниваются и, следовательно, бит младшего порядка никогда не должен быть равен нулю. Установив его на ноль, среда выполнения может использовать эту функцию для обнаружения указателей с тегами. Модель MSB перемещает бит в самый высокий слот (что безопасно, потому что ни один не должен когда-либо отображать память в область с самым высоким набором бит).

isTaggedPointer() возвращает YES/true, если младший бит установлен в модели LSB и YES/true, если старший бит установлен в модели MSB.

Смежные вопросы