Можно ли использовать std::array в качестве значения hash_table, но с другим размером

#c #arrays #caching #memory #hashmap

#c #массивы #кэширование #память #hashmap

Вопрос:

У меня есть большие данные в ОЗУ, где для каждого пользователя есть несколько коротких (2 байта) значений без знака. Их количество варьируется от 0 до 256, но реальный случай таков, что у меня 12 миллионов пользователей только с 1 значением, 6 МИЛЛИОНОВ с 2, 3,5 миллиона с 3 и т. Д. До 1 пользователя с 60 значениями.

Мне нужно выбрать тип данных, который был бы эффективным для памяти, доступа и модификации. Я хотел использовать vector для такой цели, но размер самого пустого вектора составляет 24 байта. Это слишком много для моей оперативной памяти.

Теперь я хочу использовать std::array<> , потому что он не выделяет никаких дополнительных байтов, кроме пространства для данных внутри, т.е.

 sizeof(std::array<unsigned short, 3>) // 6UL
sizeof(std::vector<unsigned short>)   sizeof(unsigned short) * v.capacity() // 24UL   6UL
 

Проблема в том, что std::array должен указывать размер во время компиляции. Как вы могли догадаться, я не могу этого сделать. Есть ли обходной путь?Я храню своих пользователей в hast_table<unsigned int, T> . Могу ли я, например, хранить массивы с разным размером для каждого ключа?

Комментарии:

1. Невозможно обойтись без игр, которые, вероятно, заставят вас вернуться на vector территорию потребления памяти. Вы могли бы выделить максимально возможный размер для всех, но это также огромная трата. Я думаю, вам придется сделать что-то нестандартное.

2. Размер a std::array является частью его типа, поэтому вы не можете иметь массивы разного размера как часть хэш-таблицы. Вы рассматривали std::unique_ptr<unsigned short[]> ?

3. Или ваш собственный векторный класс, но с чем-то вроде оптимизации коротких строк , чтобы избежать выделения кучи для коротких векторов.

4. @user4581301 можете ли вы дать мне подсказку, где я могу начать поиск этого пользовательского типа. У меня нет идей

5. @vamirio-chan Вы не ищете пользовательский тип, по определению вы пишете его самостоятельно. Подумайте о том, что вам нужно (вектор с меньшими накладными расходами) и начните кодировать его самостоятельно.

Ответ №1:

Нет. Я боюсь, что это не работает с другим размером!

Комментарии:

1. Хотя это верно, запрашивающий не может иметь разные размеры array s, будут обходные пути.