gpt4 book ai didi

c++ - 静态分配继承对象的数组

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:12 26 4
gpt4 key购买 nike

这个问题的标题很复杂,所以我会试着用一个例子来概括它。假设我有一个抽象基类,有许多类继承自它。在下面的示例中,我只展示了两个继承的类,但实际上可能有更多。

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 对象,我首先需要创建一个指向基类的指针数组,然后为了实际存储对象,我需要创建一个足够大的缓冲区来存储 N 个最大继承对象的拷贝,在本例中为 LargeChild

Base * children[N];
uint8_t childBuffer[N * sizeof(LargeChild)];

然后我可以在 childBuffer 中分布 children 中的指针,每个指针由 sizeof(LargeChild) 分隔。由于需要创建对象,因此可以使用 C++ 的“placement new”将它们放置在数组中的指定位置。我需要跟踪 childBuffer 中每个对象的类型,以便取消引用 children 中的指针,但这应该不会太糟糕。

我对整个设置/实现有几个问题:

  1. 这是解决我所描述的问题的好方法吗?我以前从未实现过这样的任何事情,所以我不知道我是否可以出去吃午饭,还有更简单的方法来实现这一点。

  2. 其中有多少可以在编译时完成?如果我有 M 类型的继承类(SmallChildLargeChild 等)但我不知道它们的大小相互关联,如何确定 childBuffer 的大小?这个大小取决于最大类的大小,但是有没有办法在编译时确定这个大小?我可以想象一些预处理器宏遍历类,评估 sizeof 并找到最大值,但我对这种级别的预处理器工作经验很少,也不知道这会是什么样子。我也可以想象使用模板是可能的,但同样,我对编译时模板魔法没有任何经验,所以我只是基于我的直觉。任何关于如何实现的指导都将不胜感激。

最佳答案

您需要能够解除分配对象吗?如果不是,覆盖 operator new 可能更容易。我指的是:

void* operator new (std::size_t size) throw (std::bad_alloc);

您的所有覆盖都将从一个大缓冲区分配内存。 size 参数指定要分配多少内存。

这样你就可以说

children[i] = new SmallChild();

编辑:如果确实需要解除分配,则需要更复杂的数据结构。无论如何,您最终可能会重新实现堆。

关于c++ - 静态分配继承对象的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25628900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com