找出几个对象的最大尺寸以放置新
Finding out the largest size of several objects for placement new
所以我正在开发一个内存非常有限的小型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>) );
相关文章:
- 为我的 c++ 类介绍制作一个三角形分类器.我有几个问题
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何返回或护理项目清单基于几个类别
- 我们如何在文本文件中找到C++中的几个单词?
- 关于 std::bitset 构造函数的几个问题?
- 几个 Nt 函数在 Windows 7 x32 上返回STATUS_WAIT_0
- std::stoi 只转换前几个字符
- C++ 通过接口使用从其他几个类继承的类
- 在矢量中使用擦除时双重释放或损坏(快速顶部).如何擦除一个矢量的几个项目知道它们的索引?
- 如何遍历几个每小时一次的根(.root)文件,并将它们组合成更大的每日数据.root文件?
- 我有几个关于参考变量的问题
- 如何复制包含指向其他几个成员之一的指针的对象?
- 在几个对象中找到一个相同的元素
- 我应该如何跟踪几个对象
- C 11按几个属性的自定义对象集合
- 几个使用相同原型的共享对象导致错误:数据库中已经存在文件
- C++的几个对象序列化
- 找出几个对象的最大尺寸以放置新
- 你能同时对一个对象调用几个方法吗
- 关于字符串对象寿命的几个问题