У меня есть функция, которая получает входной буфер n
байт и нуждается в вспомогательном буфере n
байт, чтобы обработать данный входной буфер.Предварительное распределение памяти с C++ в среде реального времени
(я знаю, вектор распределения памяти во время выполнения, скажем, что я использую вектор, который использует статическую выделенную память. Представьте, что это НЕ СТЛ вектор.)
Обычный подход
void processData(vector<T> &vec) {
vector<T> &aux = new vector<T>(vec.size()); //dynamically allocate memory
// process data
}
//usage:
processData(v)
Поскольку я работаю в режиме реального времени, я хочу заранее выделить всю память, которую мне когда-либо понадобится.
Буфер выделяется только один раз при запуске. Я хочу, чтобы всякий раз, когда я выделяю вектор, я автоматически назначу вспомогательный буфер для моей функции processData
.
я могу сделать что-то подобное с шаблонной функцией
static void _processData(vector<T> &vec,vector<T> &aux) {
// process data
}
template<size_t sz>
void processData(vector<T> &vec) {
static aux_buffer[sz];
vector aux(vec.size(),aux_buffer); // use aux_buffer for the vector
_processData(vec,aux);
}
// usage:
processData<V_MAX_SIZE>(v);
Однако рабочей много с шаблонами не очень весело (теперь давайте перекомпилировать все, так как я изменил свой комментарий!), И это заставляет меня сделать некоторую бухгалтерию всякий раз, когда я использую эту функцию.
Есть ли более приятные проекты вокруг этой проблемы?
Обязательный вопрос: вы профилированная свой код, чтобы доказать, что динамический выделение памяти действительно является проблемой? Я знаю, что все говорят, что вы должны выделить все вперёд для вещей в реальном времени, но это действительно зависит от вашей системы. –
В зависимости от требований, то, что я делал в прошлом, динамически выделяет предопределенный размер. Затем сравните требуемый размер с уже выделенным размером и просто перераспределите, если места недостаточно. это гарантирует, что у вас всегда будет достаточно места и что в конечном итоге ассигнования прекратятся, стабилизируя систему. –
@Kristo: «в реальном времени» означает, что это ошибка, если обработка занимает больше времени, чем указанное время. Профилирование может отображать только худший случай, который произошел во время прогона профиля, а не теоретический наихудший случай. Динамическое распределение безопасно только в том случае, если распределитель может гарантировать верхнюю границу времени, которое потребуется. –