Этот вопрос предназначен для встроенных систем!
У меня есть следующие варианты инициализации объекта:
Object* o = new Object(arg);
Это помещает объект в кучу и возвращает указатель на него.Я предпочитаю не использовать динамическое распределение во встроенном программном обеспечении.
Object o = Object(arg);
Это создает новый объект в стеке, а затем копирует его в объект o
и удаляет его после.Это может вызвать переполнение стека, если объект достаточно большой, чтобы поместиться в ОЗУ, но не в стеке.Я видел, как это происходит при отключенной оптимизации, я не исследовал, отличается ли она от включенной оптимизации.
Object o(arg);
Это создает объект без копирования, однако как я могу "инициализировать" o
еще раз?
Для встроенных систем я предпочитаю последний вариант, поскольку куча не используется, и в стеке нет временного объекта, который мог бы переполнить стек.
Однако я озадачен тем, как я могу это сделатьповторная инициализация объекта снова, так как:
o.Object(arg)
не разрешено.
Я мог бы создать метод с именем init (arg) и вызвать
o.init(arg)
, который делает то же самоеинициализация Object::Object(arg)
, но я бы предпочел не создавать дополнительный метод с "нестандартным" именем, которое мне нужно запомнить.
Есть ли способ вызвать конструктор уже созданного объекта длязаново инициализировать его, не делая копию?