ランタイムobjc4-723タグ付きポインター&オブジェクトの初期化プロセス
タグ付きのポインタ
伝統的に、64ビットシステムで標準意味を成さない自体のメモリアドレスへのポインタの値が、Appleの後には、ポインタは限りコンテンツは、1つのアドレスだけを表し、8 64ビットバイトがあるでしょうそれは無駄です。
したがって、この問題を最適化するために、タグ付きポインタという概念が提唱された、それは例えば非アドレス以外のリッチコンテンツへのポインタの値に表示されます。
NSNumber *number1 = @1;
NSNumber *number2 = @3;
NSNumber *number3 = @54;
(lldb) p number1
(__NSCFNumber *) $3 = 0xb000000000000012 (int)1 (lldb) p number2
(__NSCFNumber *) $4 = 0xb000000000000032 (int)3 (lldb) p number3
(__NSCFNumber *) $5 = 0xb000000000000362 (int)54
ポインタ0xb000000000000012除去前部0xb
及び後部1
進表現が2で
それを見ることができる、リテラル値は、ポインタ変数の実際の値が表現されます。
多くのオブジェクトが除去、無視することができるので、このような動作が作成されmalloc
free
大幅に効率を向上させる処理を、
isa_t
struct {
uintptr_t nonpointer
uintptr_t has_assoc
uintptr_t has_cxx_dtor
uintptr_t shiftcls
uintptr_t magic
uintptr_t weakly_referenced : 1; uintptr_t deallocating : 1; uintptr_t has_sidetable_rc : 1;
uintptr_t extra_rc : 19;
};
これは、isa_t
構造体の宣言
オブジェクトの初期化プロセス
保留中