C++ 找出几个对象的最大尺寸以放置新对象
所以我正在研究一个小型的ARM嵌入式系统,它的内存非常有限,没有MMU。我需要为不同的函数动态分配几个对象,这些函数都继承自同一个超类,但执行不同的函数,并且可能大小不同。我没有足够的内存,无法在启动时将它们全部实例化并保留在原位 因此,作为一个例子,我可能会将对象定义为:C++ 找出几个对象的最大尺寸以放置新对象,c++,embedded,placement-new,C++,Embedded,Placement New,所以我正在研究一个小型的ARM嵌入式系统,它的内存非常有限,没有MMU。我需要为不同的函数动态分配几个对象,这些函数都继承自同一个超类,但执行不同的函数,并且可能大小不同。我没有足够的内存,无法在启动时将它们全部实例化并保留在原位 因此,作为一个例子,我可能会将对象定义为: class Waveform1 : public OutputStream class Waveform2 : public OutputStream class Waveform3 : public OutputStrea
class Waveform1 : public OutputStream
class Waveform2 : public OutputStream
class Waveform3 : public OutputStream
子类将有不同的大小,因为一些子类的方法和私有变量可能比其他子类少,但可能没有一个子类比其他子类大得多
我想做的是分配一个缓冲区,用于在系统启动时放置新对象,该缓冲区足够大,可以包含最大的已定义对象。然后我应该能够在那里实例化和销毁对象而不会出现问题,因为它总是足够大,可以容纳所需的最大对象。我希望这是自动照顾,因为新的对象可能会添加到系统设计进展的名单
有没有一种规范的方法来实现这一点,这样看起来我好像知道我在做什么?我过去所做的是使用字符数组的并集和我需要存储在其中的所有类型。好处是缓冲区将正确对齐 比如:
class MyClass {
public:
union {
char buffer[1];
ClassA a;
ClassB b;
};
MyClass() {}
~MyClass() {}
};
请注意,您可以省略char buffer[1]
并将new放置在union的类成员的右侧,如new(&a)ClassA
。还要注意的是,如果ClassA或ClassB是除pod之外的任何东西,那么这只适用于C++11
现在,事实证明我实际做的和我记得做的是不同的。可能是因为我必须支持C++03。在我的实际代码中,我做到了这一点:
char DECLARE_ALIGN(8) buffer[ sizeof(int*) * 8 ];
DECLARE_ALIGN
是:
# define DECLARE_ALIGN(x) __attribute__((aligned(x)))
或
然后在代码的后面,在实际分配对象的函数中,在我将buffer作为指针传递,并将sizeof(buffer)作为buffer_len传递之后:
assert( buffer==0 || buffer_len >= sizeof(BTreeNodeWriter_X<X>) );
assert( buffer==0 || buffer_len >= sizeof(BTreePackedNodeWriter_X<X>) );
assert(buffer==0 | | buffer_len>=sizeof(BTreeNodeWriter_X));
断言(buffer==0 | | buffer_len>=sizeof(BTreePackedNodeWriter_X));
std::max({sizeof(waveorm1)、sizeof(waveorm2)、sizeof(waveorm3)})
?@Jarod42 Err…我忘了提到,STL可能不可用(max
应该足够简单,可以重新实现。我来看看-通过预处理来处理这件事绝对是我想要的。constexpr
足够吗?为什么char buffer[1]
?做new(u.buffer)waveormx
?@Jarod42是的,位置是新的。
assert( buffer==0 || buffer_len >= sizeof(BTreeNodeWriter_X<X>) );
assert( buffer==0 || buffer_len >= sizeof(BTreePackedNodeWriter_X<X>) );