У меня довольно часто возникала проблема с тем, что я получал функцию, которая требует большего объема памяти для некоторых внутренних вычислений.Функция будет вызываться с высокой частотой.Возможно, объем памяти слишком велик, чтобы поместиться в стек.Таким образом, я должен выделить и освободить память.Тем не менее, я весьма обеспокоен накладными расходами, вызванными этим частым, ненужным распределением / освобождением.
В настоящее время я вижу следующие варианты:
- распределение / освобождение каждый раз
- использование статической переменной для хранения этой памяти в сочетании с общим указателем для обеспечения безопасного уничтожения выделенной памяти
- с использованием глобальной (или файловой области) памяти для сохранения памяти, выделенной на все время.
- инкапсуляция функции внутри класса и добавление переменной-члена, содержащей выделенную память (здесь я в основном обеспокоен
в отношении подхода 3-4: Меня больше всего беспокоит, что на самом деле значения вэта память действительна только внутри этой функции и должна использоваться только там. Однако, на самом деле область действия переменной больше, и неправильное использование или случайное использование переменных легко возможно. Необходимо четко указать, что она не предназначена для использованияэти переменные вне функции,Мой любимый сейчас вариант 2. Я был бы очень рад услышать ваше мнение о подходах наилучшей практики в этом случае.
Слегка измененный вопрос: представьте, что теперь у нас есть метод-член вместо отдельной функции.Здесь мой любимый подход № 2 больше не будет работать, поскольку все экземпляры класса будут использовать один и тот же буфер вычислений.Таким образом, я думаю, что есть только две альтернативы: 1. распределение / освобождение каждый раз 2. использование переменной-члена для каждого плагина для сохранения выделенной памяти.
Относительно подхода 2 Я снова получил некоторое недоверие: переменная-членмогут быть доступны для всех функций в одном и том же классе, хотя предполагаемая область должна быть только для временного вычисления в пределах этой единственной функции-члена.
Возможно, могут помочь некоторые соглашения об именах для этой переменной, а также комментарии: Например,
...
private:
/** this variable is only intended to be used temporarily within fct1 */
std::shared_ptr<std::array<double, 10000>> tmpBuffer;
...