Скажем, у меня есть ассоциативный массив с ключом unsigned int
; значения могут быть любого типа фиксированного размера. Существует некоторый предопределенный максимальный номер. экземпляров.
Пример использования API: MyStruct * valuePtr = get(1234);
и put(6789, &myStructInstance);
...базовый.
Я хочу свести к минимуму промахи кеша, поскольку я быстро и случайным образом читаю записи из этого массива, поэтому я предварительно malloc(sizeof(MyType) * MAX_ENTRIES)
гарантирую локальность ссылок, насколько это возможно.
Универсальность важна для массива значений. Я просмотрел псевдогенерики C, но предпочитаю void *
для простоты; однако не уверен, что это противоречит целям производительности. В конечном счете, я хотел бы знать, что лучше для производительности.
Как мне реализовать свой ассоциативный массив для повышения производительности? Мысли до сих пор...
- Должен ли я передать ассоциативному массиву один указатель
void *
на массив значенийmalloc
ed и разрешить ему использовать его внутри (для чего нам нужно будет гарантировать соответствующий размер массива ключей)? Могу ли я сделать это в общем случае, поскольку тип должен (?) быть известен для индексации в массиве значений? - Есть ли у меня отдельный
void * valuePtrs[]
в ассоциативном массиве, чтобы эти указатели указывали на каждый элемент в массиве значенийmalloc
ed? Казалось бы, чтобы избежать необходимости знать о конкретном типе? - Должен ли я использовать псевдогенерики C и, таким образом, разрешить
get()
возвращать определенный тип значения? Конечно, в этом случае единственным преимуществом является отсутствие необходимости явного приведения, например.MyStruct* value = (MyStruct*) get(...)
... элемент массива все еще должен быть разыменован, и поэтому он имеет те же накладные расходы?
И вообще, имеет ли смысл описанный выше подход к минимизации промахов?
void *
, поскольку он может указывать на что угодно, и тогда ваш массив становится массивом указателей. - person unwind   schedule 10.02.2015bool get(void *value, const void *key)
или что-то в этом роде, чтобы скопировать значение, размер которого неизвестен во время компиляции. - person unwind   schedule 10.02.2015