gpt4 book ai didi

c++ - 在编译时确定最大的派生类

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:54 25 4
gpt4 key购买 nike

假设我有一个类 Base,它有 N 个子级,Derived0,Derived1,...,DerivedN。我正在尝试为从 Base 继承的对象创建一个池分配器,并且实现依赖于了解 Base 的最大子级的大小,因为每个池都是大到足以容纳这些物体之一。这是一个包含普通类和 N = 2 的简单示例。实际上,N 可能更大,Base 的子级可能不是简单的 POD 类。

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 个 child 。我已经为此苦苦思索了一段时间,这就是我所能想到的:

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 开始增长,它变得非常困惑。是否有任何可扩展的方法来实现这一点,您不需要手动构建嵌套的“一元树”(因为缺少更好的术语)随着 N 的增加而变得一团糟?

这是我正在使用的约束/环境:

  • 最大的 child 的大小必须在编译时已知。
  • C++03 兼容性是必要的。出于好奇,我对任何建议(欢迎使用 C++11!)感兴趣,但我最终将在不支持 C++11 的编译器上构建它。我知道 C++11 添加了对具有非 POD 成员的 union 的支持,所以我认为您可以使用它稍微清理一下接口(interface)。
  • 这将仅使用 GCC 构建,因此 GCC 扩展在技术上是一个选项。

如有任何帮助/建议,我们将不胜感激。

最佳答案

您可以考虑使用 boost::variant并取其大小:

    sizeof (boost::variant< Derived0, Derived1, Derived2 > )  

这将返回最大元素的大小。

顺便说一句,它还可以简化您的缓冲区管理,方法是使它成为这种变体的缓冲区,并直接索引正确的元素。好消息是 boost 会处理对齐要求:

    typedef boost::variant< Derived0, Derived1, Derived2 > DerivedVar; 
DerivedVar buffer[NUMBER_OF_POOLS];

关于c++ - 在编译时确定最大的派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29638415/

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