假设我有一个类Base,它有N个子类Derived0,Derived1,...,DerivedN。我试图为从Base继承的对象创建池化分配器,并且实现依赖于知道Base最大子类的大小,因为每个池都必须足够大,以容纳其中一个对象。这是一个简单的示例,其中包含简单的POD类和N = 2。实际上,N可能更大,而Base的子类可能不是简单的POD类。
这个方法可行,但是随着
以下是我工作的约束/环境:
- 最大子节点的大小必须在编译时确定。 - 需要 C++03 兼容性。为了满足好奇心,我对任何建议感兴趣(欢迎 C++11!),但最终我将在一个不支持 C++11 的编译器上构建它。我知道 C++11 添加了对具有非 POD 成员的联合体的支持,所以我想您可能可以使用它来简化接口。 - 这将仅在 GCC 中构建,因此 GCC 扩展技术在技术上是可选的。
非常感谢您的帮助和建议。
class Base {
public:
virtual ~Base() = 0;
};
class Derived0 : public Base {
int a;
};
class Derived1 : public Base {
int a, b;
};
class Derived2 : public Base {
int a, b, c;
};
假设我想创建一个足够大的缓冲区来存储10个孩子。我已经苦苦思索了一段时间,下面是我的解决方案:
static const size_t NUMBER_OF_POOLS = 10;
static const size_t LARGEST_CHILD_SIZE =
sizeof(Derived0) > sizeof(Derived1) ?
sizeof(Derived0) > sizeof(Derived2) ?
sizeof(Derived0) :
sizeof(Derived2) :
sizeof(Derived1) > sizeof(Derived2) ?
sizeof(Derived1) :
sizeof(Derived2);
char buffer[NUMBER_OF_POOLS * LARGEST_CHILD_SIZE];
这个方法可行,但是随着
N
增加,这种嵌套的“一元树”将变得非常混乱。有没有可扩展的方法可以实现这个,而不需要手动构建一个逐渐增长成巨大混乱的嵌套“一元树”(暂时没有更好的术语)?以下是我工作的约束/环境:
- 最大子节点的大小必须在编译时确定。 - 需要 C++03 兼容性。为了满足好奇心,我对任何建议感兴趣(欢迎 C++11!),但最终我将在一个不支持 C++11 的编译器上构建它。我知道 C++11 添加了对具有非 POD 成员的联合体的支持,所以我想您可能可以使用它来简化接口。 - 这将仅在 GCC 中构建,因此 GCC 扩展技术在技术上是可选的。
非常感谢您的帮助和建议。
constexpr
函数开始,该函数返回所有参数的最大值。在 C++03 中,您可能会使用枚举类型。 - Ben Voigt