【发布时间】:2019-02-12 08:09:22
【问题描述】:
这个问题是针对嵌入式系统的!
我有以下选项来初始化一个对象:
Object* o = new Object(arg);
这会将对象放入堆中并返回指向它的指针。我不喜欢在嵌入式软件中使用动态分配。
Object o = Object(arg);
这会在堆栈中创建一个新对象,然后将其复制到对象o 并在之后将其删除。如果对象大到足以放入 RAM 但不能放入堆栈,这可能会导致堆栈溢出。我已经看到关闭优化时会发生这种情况,我还没有探索过启用优化是否会有所不同。
Object o(arg);
这会创建对象而不进行复制,但是我怎样才能再次“初始化”o?
对于嵌入式,我更喜欢最后一个选项,因为不使用堆,并且堆栈中没有可以执行堆栈溢出的临时对象。
但是我对如何重新初始化对象感到困惑,因为:
o.Object(arg)
不允许。
我可以创建一个名为 init(arg) 的方法并调用
o.init(arg)
这与 Object::Object(arg) 执行相同的初始化,但我不希望创建一个额外的方法,该方法具有我需要记住的“非标准”名称。
有没有办法调用已经创建的对象的构造函数来重新初始化它而不进行复制?
【问题讨论】:
-
“这会在堆栈中创建一个新对象,然后将其复制到对象 o 并在之后将其删除。” - 仅当您的编译器运行良好且真正完全愚蠢时.. ..啊,我看到你编译时没有优化...
-
你的类是否支持 move 语义或者它是否有
swap(...)函数? -
如果您将对象定义为
Object o;,那么只需 assign 给它以再次“初始化”它吗?如o = Object();. -
出于好奇,为什么需要再次“初始化”它?
-
@StoryTeller 因为我正在为嵌入式编程,所以我更喜欢控制内存,并且我将所有“大”事物的变量放在任何函数之外,以便在编译时分配它们,我知道它们合身。我喜欢在 init 函数中初始化它们,因为我认为代码更整洁一些。在某些情况下,如果我让处理器进入睡眠状态,并且某些硬件和软件都需要重新初始化,可能还需要重新初始化对象。