2011-02-07 4 views
0

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

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

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

Для быстрого извлечения объектов на клавишах я бы использовал алгоритм бинарного поиска - так что массив должен быть СОРТИРОВАН (внимание!) На адресам памяти первых объектов пар.

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

ли это плохая идея, при условии, что:

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

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

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

Спасибо!

+1

«Как получить адрес памяти из указателя?» значение указателя * есть * адрес памяти ... – Richard

+0

Я знаю, что это внутренне это :), но я всегда думал, что не могу сравнивать значения указателя напрямую с < and >. – wh1t3cat1k

ответ

1

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

1

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

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