Tim*_*imo 5 c++ embedded constructor destructor
我正在一个内存不足的嵌入式系统上工作,更重要的是,由于存在实时的软约束(即,如果我们没有按时完成但没有人死,那是一个错误),所以我不能使用动态内存分配。
但是,偶尔需要重新初始化子系统,并且存在许多与“并非一切都正确清理或重置”相关的错误。当然,这正是构造函数和析构函数应该解决的问题,但是由于我们不是动态分配的,因此无法在要销毁对象然后从头分配新对象的地方使用惯用语。此处相关的对象是全局变量)。
因此,最后通常是在构造函数中有设置代码,以及一个彼此相似但不完全相同的reinitialize -type函数,因为reinitialize函数还完成了很多析构函数的工作。
我正在考虑的一种解决方法是编写一个“更新” -template(这只是草稿,可能包含错误且可能无法完成):
template<typename T, typename .. Args>
void renew(T & obj, Args&&... args) {
obj.~T();
new(&obj) T(std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)
可以用来重新初始化非动态分配的变量。所以举个例子
A a{17};
... //Do something with a
renew(a, 14);
...//work with the new a, no need to reallocate memory
Run Code Online (Sandbox Code Playgroud)
这将允许在没有动态内存分配的情况下获得构造函数和析构函数(主要是初始化和初始化对象的单一方法)的某些优点。请注意,上面的用法已简化,实际上,这将主要用于主循环中非常特定的点以及代表实际物理子系统的全局对象。
问题:这是明智的做法吗?还是有更好的选择?
这里有一个非常相似的问题,调用构造函数重新初始化object。我问的是很多相同的事情,但特别是在嵌入式编程的情况下,在这种情况下,我无法以动态分配的常规方式进行操作。
动态内存分配与构造函数和析构函数完全无关。
如果您使用new或delete(如在更新函数中),则您正在使用动态内存分配。
构造函数或析构函数并不总是意味着您正在动态分配内存。
“renew”函数可能应该在类的operator=中实现,而不是作为外部函数,所以:
A a{17}
...
a = 14;
...
Run Code Online (Sandbox Code Playgroud)
您应该做什么的示例:
class TwoInts
{
private:
int int1;
int int2;
public:
TwoInts(int a = 6, int b = 7): int1(a), int2(b) {}
TwoInts(const TwoInts& other): int1(other.int1), int2(other.int2) {}
TwoInts& operator=(TwoInts& other)
{
a = other.a;
b = other.b;
}
};
TwoInts i(16);
//do stuff
i = TwoInts(68, 14);
//do stuff
Run Code Online (Sandbox Code Playgroud)
上面的代码没有做任何内存分配。
归档时间: |
|
查看次数: |
86 次 |
最近记录: |