gpt4 book ai didi

c++ - 计算派生类的最大大小

转载 作者:太空狗 更新时间:2023-10-29 21:31:21 31 4
gpt4 key购买 nike

我们有一个 My_list 类,它有一个指向 Abstract_things 的指针列表。为了优化内存使用,所有派生的事物都使用一个内存池,该内存池是通过“新建和删除”构造型建立的。为了在应用程序初始化期间正确调整池的大小,构建器会找出最大的事物并根据它调整池的大小。

设计难题在于,如果向模型添加新事物(用红色 Thing_4 表示),设计人员必须知道转到 Builder 来调整逻辑。我观察到我们的团队很难记住这样做(Builder 中没有考虑我们的一半事物)。我非常担心子孙后代会忽视这一点。

我的问题是我该如何改进它?如果在创建 Thing_4 类的过程中,所有 max_size 的东西都自动得到处理,那就太好了。不过我想不出办法。

注意:检查我的图片我意识到有一个错误。代码框中的最后一行应为 Abstract_thing::set_max_pool_size(max_size, max_number)。

编辑:我不知道如何显示图片。预览窗口中的一切看起来都不错,但发布时却不存在。有帮助吗?

编辑:为了提供更多背景知识,这是安全关键系统中嵌入式应用程序设计的一部分。我们可以在应用程序初始化时从堆中分配内存,但在我们退出初始化阶段后,就不能分配动态内存了。尝试这样做会使应用程序崩溃。因此,我们编程到我们使用的最大尺寸和最大数量的实例。拥有一个包含足够空间用于所有派生对象的池是比为每个派生对象拥有一个池更好的方法。

alt text http://img262.imageshack.us/img262/4470/designproblemof1.png

最佳答案

已更新:好的...嵌入式系统要求有所改变。

您可以使用一个类来自动注册派生类,然后将此类的静态实例添加到每个派生类。虽然你仍然需要记住这样做,但至少它是独立的在一个地方。

类似于:

template<class T>
class RegisterPoolClass
{
public:
RegisterPoolClass() { init_pool.Register(sizeof(T)); }
};

class Thing_1 : public Abstract_Thing
{
static RegisterPoolClass<Thing_1> sInitializer;
...
};

RegisterPoolClass<Thing_1> Thing_1::sInitializer;

您可以使用宏来封装每个派生类中所需的代码,就像 ATL 所做的那样。

关于c++ - 计算派生类的最大大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/282619/

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