В настоящее время я занимаюсь созданием встроенной системы с использованием процессора ARM Cortex M3 с 64 КБ SRAM. На данный момент я ищу способ обеспечить детерминированную производительность с помощью контейнеров STL, что включает в себя обеспечение того, что я не могу закончиться нехваткой памяти во время выполнения.
Я в первую очередь обеспокоен тем, как контейнеры STL выполняют динамическое распределение памяти. Хотя я могу использовать собственный распределитель, чтобы эти структуры получали память из пула, который я отложил, мне нужно было бы настроить отдельный пул для каждой структуры, чтобы гарантировать, что один экземпляр структуры не сможет использовать другое пространство экземпляра.
Я работаю с другими людьми в этом проекте, которые не хотят беспокоиться о необработанном распределении памяти и предпочитают использовать "хорошо известные" структуры данных (стек, очередь, deque и т.д.). Поэтому в настоящее время я рассматриваю возможность создания оберток вокруг C-массивов для обеспечения этих структур. Это позволит статически распределять память, необходимую для поддержки этих контейнеров, и позволяет другим разработчикам знать размер контейнера, который они создали до времени выполнения, на основе информации о размере кода, предоставленной компилятором. На мой взгляд, это гарантирует, что проблемы с отключением памяти не могут произойти во время выполнения и значительно упростить разработку системы.
Другим вариантом будет выделение контейнеров STL при инициализации системы. После периода инициализации дополнительного распределения динамической памяти не произойдет. Однако, насколько мне известно, стандартные структуры данных С++ STL не поддерживают это - для этого потребуется, чтобы контейнеры, такие как стек, могли быть предварительно выделены (аналогично вектору).
Я был бы признателен за любые замечания относительно моего предложения по созданию классов вокруг стандартных C-массивов? Кроме того, существует ли более простой способ для размещения статического размера STL-контейнера, такого как статический размер стека или очереди, во время компиляции? (Я знаю, что это возможно с помощью вектора, но другие я не уверен)
Примечание. Я прочитал другой вопрос (Embedded С++ для использования STL или нет)), но автор этого вопроса не пояснил, сколько памяти они имели (другие тогда, как они использовали процесс ARM7) или, похоже, рассматривают решение, подобное моему.
Второе примечание. Я знаю, что для некоторых разработчиков 64 КБ SRAM может показаться большой памятью. Фактически, я сделал разработку на процессорах AVR со значительно меньшим объемом памяти, поэтому я понимаю эту перспективу. Однако из моего текущего (возможно, неинформированного) представления, 64 КБ памяти не так много, когда речь идет о контейнерах STL.