контейнерный класс для постоянных данных с инициализацией во время компиляции

Я ищу что-то, что является std :: vector, но без больших накладных расходов и немного больше, чем std :: array, потому что с std :: array у меня не было размера, сохраненного в любом случае (это известно только из самого типа).

Чего я хочу добиться:

Написано с «динамическими» контейнерами это как:

std::map< int, std::vector< std::pair<int,int>>>;

Мне не нужно никаких изменений во время выполнения, но мне нужна информация о размере во время выполнения. Замена std :: vector на std :: array может не сработать, потому что массив должен быть одинакового размера для всех записей на карте, а это не то, что мне нужно.

Только я! хочу спросить, есть ли уже доступная реализация вокруг. Если ответ просто «Нет», нет необходимости предлагать, как выполнять работу. Я только хочу не изобретать велосипед снова 🙂

Предыстория: я могу использовать stl на своих маленьких контроллерах avr, но накладные расходы «немного» высоки. Поэтому я надеюсь найти стандартную реализацию, которая соответствует потребностям в представлении констант времени во время компиляции с реализованными функциями, такими как begin () / end () и итераторами, чтобы выполнить минимальные требования к контейнерам, чтобы их можно было использовать с Range на основе for и другими.

C ++ 14 также доступен, если есть что-то, что я ищу.

Я обнаружил, что реализован полный шаблон, в котором доступ к данным также является постоянной времени компиляции, например:

container.get<2>()

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

РЕДАКТИРОВАТЬ: какие проблемы / накладные расходы возникают при использовании std :: vector:

При использовании std :: vector мне нужно также new / delete, что приводит к наличию malloc / free для avr. Я также обнаружил, что на avr инициализация самого вектора занимает около 350 байтов кода для каждого экземпляра шаблона, который я использую. Функции доступа, такие как operator[] а также итераторы очень малы.

0

Решение

Чтобы избежать накладные расходы из std::vector, вы можете использовать вместо std::initializer_list

const std::map<int, std::initializer_list<std::pair<int, int>>>
2

Другие решения

Мне не совсем понятно, что вы ищете, но я думаю, что вы могли бы достичь того, что вам нужно, с помощью следующего:

  1. Вы не знаете точный размер каждого элемента (скажем, N элементов), и вы узнаете его при запуске программы. Затем, когда вы знаете размер контейнеров, зарезервируйте только один непрерывный блок памяти для хранения всех внутренних элементов всех контейнеров. (одно динамическое распределение)
  2. Создайте карту с векторами, построенными по диапазону: std::vector(start, end)где начало и конец вычисляются через блоки из N элементов.
  3. Затем заполните карту. Если вам не нужна карта, вы также можете рассчитать, где каждый вектор будет начинаться и заканчиваться, и просто создать начальный массив с индексами позиций каждого вектора …
1

То, что вы спрашиваете, кажется невозможным в принципе. Вы говорите, что хотите избежать размещения в куче вашего вектора, подобного типу, но размер типа в стеке должен быть известен во время компиляции и одинаков для всех членов этого типа. Поскольку map является однородным контейнером, тип значения должен быть одного типа с постоянным размером. Вы можете заменить карту на кортеж, но тогда все ваши ключи должны быть известны во время компиляции.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector