2011-02-07 10 views
0

キーをコピーしない(そのまま保持する)カスタム辞書を作成したい。整数アドレスに基づくコンパレータ

内部的には、NSMutableArrayをペアの最初のオブジェクトがキーで、2番目が値である特別なペアオブジェクトで使用する予定です。

キーはすべて一意です。

キー上のオブジェクトをすばやく検索するために、バイナリ検索アルゴリズムを使用します。配列は、最初のオブジェクトののメモリアドレスに配列される必要があります。

(私はコールバックの特別なセットでCFDictionaryRefを使用することを拒否した理由ところで、これは - 私は、合理的なハッシュが提供されないだろうというとき、それは場合にはO(n)に分解することが疑われる)

されていますこの悪い考え、それを想定して:キーとして使用

  • オブジェクトは(つまり、私が代わりにアドレス比較のisEqual:を使用することはできません)内部で変更される可能性があり、
  • キーとして使用されるオブジェクトは割り当て解除されません(これは合理的です - 特殊なペアオブジェクトによって保持され、ペアは内部NSArrayによって保持されます)。

なぜ悪い(または良い)のですか?

ポインタからメモリアドレスを取得するにはどうすればよいですか? long long intなどにキャストするだけですか?

ありがとうございました!

+1

"ポインタからメモリアドレスを取得する方法は?"ポインタ値は*メモリアドレスです... – Richard

+0

私はそれが内部的にわかっています:)しかし、私はいつもポインタ値を直接< and >と比較することはできないと考えていました。 – wh1t3cat1k

答えて

1

ポインタから整数値を取得するには、intptr_tまたはuintptr_tにキャストします。これらの型は<stdint.h>で定義されており、明示的にポインタの値を保持するのに十分な大きさであることが保証されています。

1

私はobjective-cのポインタがc/C++に似ていると仮定します。私はスタックトレースを検索するために使用するメモリアドレスのソートされた配列を構築しました。 64ビットマシンでは、スカラー変数が64ビット、おそらくはlong intにキャストされるべきです。または、uint64_t型を使用できる場合は、正しいサイズが保証されます。 32ビットマシンの場合は、符号なし32ビット整数またはuint32_tを使用します。ポインターに> <> = < = =と - 演算子を使用することができ、+演算子にポインターと整数を使用することもできます。

関連する問題