@communistic_sistema
Биохимик, но в программировании немного шарю

Как эффективно хранить неопределенное количество разных типов данных?

Необходимо хранить разные типы данных в памяти.
Число типов неопределенно заранее (то есть их можно дополнять по ходу исполнения, правда их описание и их обработка описывается на основе уже существующих типов).
Хранение данных не должно приводить к фрагментации.
Хранение данных должно быть эффективным - без лишних данных о других данных (то есть класс и т.д. для примитива - отметаем) и без пустот.
Работа с данными должна быть эффективна и быстра (максимально быстрый доступ и максимально быстрое удаление и аллокация).
Я пробовал - вектор с variant (но это создает пустоты).
Я пробовал вектор обозначающий типы и blob (произвольный объем памяти), но доступ по данным и аллокация оказалось медленной.
Как хранить разные типы данных при таких условиях?
  • Вопрос задан
  • 318 просмотров
Решения вопроса 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Ну, без дырок совсем не получится. Во-первых, сами структуры могут быть с дырками из-за выравнивания. Потом, не любой тип можно положить куда угодно, опять же, из-за выравнивания. Далее, при удалении будут образовываться дырки, которые не факт что и можно заполнить (без медленного перелопачивания всей структуры).

Евгений Шатунов правильно говорит, что это уже алгоритм аллокатора получается, а не структура данных. Ну а дальше, можно как-то выделять сырую память под ваши элементы, и в соседнем векторе указателей хранить где будет лежать i-ый элемент для быстрого доступа.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Griboks
@Griboks
Так и в чём заключается проблема? Данные - это биты. Память - это биты. Хранити биты в битах)

По сути, вам нужно просто дописывать новые данные в конец непрерывного участка памяти, запоминая их тип и интервал где-нибудь ещё. Поскольку метаданные имеют фиксированный объём, то проблем с их хранением возникнуть не должно (например, массив или захардкодить). Если вдруг вам повезло, и ваши типы имеют соответствующие машинному слову объёмы, то можно сразу в байтах хранить - так будет немного быстрее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы