这个问题的标题是相当复杂的,所以我会尝试用一个例子对它进行框架。假设我有一个抽象基类,有许多继承自它的类。在下面的例子中,我只展示了两个继承的类,但实际上可能会有更多。静态分配继承对象数组
class Base {
public:
Base();
virtual ~Base() = 0;
/// Other methods/members
};
class SmallChild: public Base {
public:
SmallChild();
~SmallChild();
/// Other methods/members such that sizeof(SmallChild) < sizeof(LargeChild)
};
class LargeChild : public Base {
public:
LargeChild();
~LargeChild();
/// Other methods/members such that sizeof(LargeChild) > sizeof(SmallChild)
};
我需要实现一个容器,它最多可以存储N
继承的对象。这些对象需要在运行时创建/销毁并放置在容器中,但由于项目中的约束(特别是在嵌入式硬件上),动态内存分配不是一种选择。容器需要静态分配所有空间。另外,编译器不支持C++ 11。
只有一种方法可以实现。为了引用N
对象,我首先需要创建一个指向基类的指针数组,然后实际存储对象,我需要创建一个足够大的缓冲区来存储最大继承对象的副本,在这种情况下是LargeChild
Base * children[N];
uint8_t childBuffer[N * sizeof(LargeChild)];
我可以随后在children
分配指针横跨childBuffer
,每个都由sizeof(LargeChild)
分离。由于需要创建对象,因此可以使用C++的“placement new”将它们放置在数组中的指定位置。我需要跟踪childBuffer
中每个对象的类型,以取消引用children
中的指针,但这不应该太糟糕。
我有一个关于这个整个设置/执行几个问题:
这是一个很好的方法为我所描述它解决问题?我从来没有像以前那样执行过任何操作,所以我不知道我是否在这里吃午饭,还有更简单的方法来完成此任务。
这可以在编译时完成多少?如果我有
M
类型的继承类(SmallChild
,LargeChild
等)但我不知道知道它们的大小相互关系,我怎么能确定大小childBuffer
?这个大小取决于最大类的大小,但是有没有办法在编译时确定这个大小?我可以想象一些预处理器宏遍历类,评估sizeof
并找到最大值,但是我对这个级别的预处理器工作很少有经验,不知道这会是什么样子。我也可以想象使用模板可以做到这一点,但是我再也没有关于编译时模板魔法的经验,所以我只是基于我的直觉。任何方向如何实施这将不胜感激。
这有帮助吗? http://stackoverflow.com/questions/354442/looking-for-c-stl-like-vector-class-but-using-stack-storage – PaulMcKenzie 2014-09-02 17:27:29
如果你有一个派生类型的列表,那么宏+预处理器可以工作与那个名单找到最大的类型。将所有派生类型的列表放在一个地方是否可行?另外,多大(约)是最大的? – 2014-09-02 17:43:05
第一次擦除后是否会插入插入物,还是混在一起? – 2014-09-02 17:44:18