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

举个例子,我可能定义了类似的对象:

class Waveform1 : public OutputStream
class Waveform2 : public OutputStream
class Waveform3 : public OutputStream

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

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

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

最佳答案

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

就像是:

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)))

或者
# 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>) );

关于c++ - 找出几个对象的最大尺寸以放置 new,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35371369/

10-11 22:38
查看更多