1

私はObjectiveC++クラスを持っています。そのインスタンスは、C ++オブジェクトの任意のセットを格納し、それぞれを対応するObjectiveCオブジェクトに関連付けるために必要です。C++オブジェクトが与えられたときにObjectiveCオブジェクトを検索すると、パフォーマンスが低下するため、より良い解決策を探しています。

[NSValue valueWithPointer:]を使用してキーを作成した後、現在NSMutableDictionaryにペアを保存しています。+ valueWithPointer:が-objectForKey:の約2倍のコストであるルックアップ時間は、単純に遅すぎます。

C ++オブジェクトはサードパーティのフレームワークにあり、一意の識別子を提供しません。

C ++オブジェクトのセットは、常に1ダースの要素よりも小さくなります。

これらのルックアップを実行するためのより高速なアプローチは何ですか?

4

2 に答える 2

3

試してみる価値があると思われる 3 つのアプローチがあります。

  1. NSMapTable を使用する
  2. objc_setAssociatedObject を使用する
  3. std::unordered_map または std::map を使用します

objc_setAssociatedObject は舞台裏で std::unordered_map を使用します。

于 2012-12-04T08:13:34.977 に答える
0

[NSValue valueWithNonRetainedObject:]最近、遅すぎるという同様の問題がありました。

私が行った解決策は、レベルを下げて、CoreFoundation の CFMutableDictionary を使用することでした。CFMutableDictionary Referenceをご覧になることをお勧めします。CFDictionaryAddValue()、で通常の C ポインターCFDictionaryRemoveValueを使用するため、Obj-C と C++ のインターフェイスとして使用するのが最適です (C は共通分母です)。

私がan を使用するよりもそうした方がよい理由はstd::unordered_map、この種のことで C++ を最小限に抑えたいと思う傾向があるからです。Obj-C++ はちょっとしたハックであり、実際の Obj-C と既存の C++ コードとの間のコードを接着するように縮小するのが最善です。

于 2012-12-30T21:26:15.537 に答える