Компаратор на основе целочисленных адресов - PullRequest
0 голосов
/ 07 февраля 2011

Я хочу создать пользовательский словарь, который не копирует свои ключи (просто сохраняет).

Внутренне я планирую использовать NSMutableArray со специальным объектом Pair, где первый объект парыявляется ключом, а второе - значением.

Все ключи уникальны.

Чтобы быстро получать объекты по ключам, я бы использовал алгоритм двоичного поиска - поэтому массив должен бытьSORTED (внимание!) По адресам памяти первых объектов пар.

(кстати, именно поэтому я отказался использовать CFDictionaryRef со специальным набором обратных вызовов -Я подозреваю, что он понижается до O (n) в случае, если разумный хеш не будет предоставлен)

Это плохая идея, если предположить, что:

  • Объекты, используемые в качестве ключей,внутреннее изменение (то есть я не могу использовать isEqual: вместо сравнения адресов);
  • Объекты, используемые в качестве ключей, НЕ собираются освобождаться (что разумно - они сохраняются специальным объектом Pair, аПара удерживается интернойl NSArray).

Почему это плохо (или хорошо)?

Как получить адрес памяти из указателя?Просто приведите его к long long int или что-то в этом роде?

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Чтобы получить целочисленное значение из указателя, приведите к intptr_t или uintptr_t. Эти типы определены в <stdint.h> и явно гарантированно будут достаточно большими, чтобы содержать значение указателя.

1 голос
/ 09 марта 2011

Я предполагаю, что указатели в target-c похожи на c / c ++.Я построил отсортированные массивы адресов памяти, чтобы использовать их для поиска трассировки стека.На 64-битной машине она должна быть приведена к любой скалярной переменной 64-битной, вероятно, длинной int.Или, если вы можете использовать тип uint64_t, это гарантирует правильный размер.Для 32-разрядного компьютера используйте 32-разрядное целое число без знака или uint32_t.Вы можете использовать операторы> <> = <= = и - для указателей, а также оператор + с указателем и целым числом.</p>

...