找出几个对象的最大尺寸以放置新

Finding out the largest size of several objects for placement new

本文关键字:对象 几个      更新时间:2023-10-16

所以我正在开发一个内存非常有限的小型ARM嵌入式系统,并且没有MMU。我有几个对象需要为不同的函数动态分配,这些函数都继承自同一个超类,但执行不同的函数,并且大小可能不同。我没有足够的内存在启动时将它们全部实例化并将它们留在原位。

因此,作为示例,我可能会定义如下对象:

class Waveform1 : public OutputStream
class Waveform2 : public OutputStream
class Waveform3 : public OutputStream
子类

将具有不同的大小,因为有些子类的方法和私有变量可能比其他子类少,但可能没有一个比其他任何子类大得多。

我想做的是分配一个缓冲区,以便在系统启动时与放置新放置一起使用,该缓冲区足够大以包含最大的定义对象。然后,我应该能够毫无问题地实例化和销毁对象,因为它总是足够大,可以容纳所需的最大对象。我希望这能自动处理,因为随着系统设计的进行,新对象可能会添加到列表中。

有没有一种规范的方法来实现这一点,所以看起来我知道我在做什么?

我过去所做的是使用 char 数组和我需要存储在其中的所有类型的联合。好处是缓冲区将正确对齐。

像这样:

class MyClass {
    public:
        union {
            char buffer[1];
            ClassA a;
            ClassB b;
        };
    MyClass() {}
    ~MyClass() {}
};

请注意,您可以省略char buffer[1]并将 new 直接放置到联合的类成员上,例如 new (&a) ClassA 。另请注意,如果 A 类或 B 类是 POD 以外的任何内容,则这仅适用于 C++11。

现在,事实证明,我实际所做的与我记忆中所做的不同。可能是因为我不得不支持C++03。在我的实际代码中,我这样做了:

char DECLARE_ALIGN(8) buffer[ sizeof(int*) * 8 ];

DECLARE_ALIGN是:

#  define DECLARE_ALIGN(x)  __attribute__((aligned(x)))

# define DECLARE_ALIGN(x) __declspec( align(x) )

然后在代码的后面,在实际分配对象的函数中,在我将缓冲区作为指针传递之后,将 sizeof(buffer( 作为buffer_len:

assert( buffer==0 || buffer_len >= sizeof(BTreeNodeWriter_X<X>) );
assert( buffer==0 || buffer_len >= sizeof(BTreePackedNodeWriter_X<X>) );