Я работаю над встроенной системой, где не хватает памяти, и что еще более важно, поскольку существует мягкое ограничение в реальном времени (т.е. это ошибка, если мы не делаем крайний срок, но никто не умирает), я не могу использовать динамическое распределение памяти.
Однако иногда возникает необходимость переинициализировать подсистему, и было множество ошибок, связанных с тем, что не совсем все очищалось или корректно сбрасывалось. Это, конечно, именно та проблема, которую должны решать конструкторы и деструкторы, но, поскольку мы не выделяем динамически, мы не можем использовать идиому, где мы уничтожаем объект, а затем выделяем новый с нуля (в основном это здесь актуальны объекты глобальные).
Таким образом, в конце обычно есть установочный код в конструкторе и функция типа reinitialize, которые похожи друг на друга, но не идентичны, поскольку функция reinitialize также делает многое из того, что сделал бы деструктор.
Единственный выход, о котором я думаю, - написать шаблон «обновить» (это всего лишь черновик, может содержать ошибки и, возможно, не завершен):
template<typename T, typename .. Args>
void renew(T & obj, Args&&... args) {
obj.~T();
new(&obj) T(std::forward<Args>(args)...);
}
, который можно использовать для повторной инициализации нединамически распределенных переменных. Так например
A a{17};
... //Do something with a
renew(a, 14);
...//work with the new a, no need to reallocate memory
Это позволило бы получить некоторые преимущества конструкторов и деструкторов (в первую очередь, единственный способ инициализации и деинициализации объекта) без динамического выделения памяти. Обратите внимание, что использование выше упрощено, на практике это в основном будет использоваться в очень специфических точках основного цикла и в глобальных объектах, представляющих реальные физические подсистемы.
Вопрос: это разумный способ сделать это? Или есть лучшая альтернатива?
Здесь очень похожий вопрос Вызов конструктора для повторной инициализации объекта . Я спрашиваю о том же самом, но конкретно в контексте встроенного программирования, где я не могу делать вещи обычным способом с динамическим размещением.