gpt4 book ai didi

c++ - 多态数据存储的替代方案

转载 作者:行者123 更新时间:2023-11-28 07:30:56 29 4
gpt4 key购买 nike

我正在存储大量计算数据,目前我正在使用多态类型来减少所需的存储量。除了在我完成后删除对象外,一切都非常快,我认为必须有更好的选择。该代码计算每一步的状态,并根据存在的条件存储某些值。最坏的情况是存储完整的对象状态,而最好的状态是几乎不存储任何内容。 (非常简化的)设置如下:

class BaseClass
{
public:
virtual ~BaseClass() { }

double time;
unsigned int section;
};

class VirtualSmall : public BaseClass
{
public:
double values[2];
int othervalue;
};

class VirtualBig : public BaseClass
{
public:
double values[16];
int othervalues[5];
};

...

std::vector<BaseClass*> results(10000);

适当的对象类型在计算期间生成,指向它的指针存储在 vector 中。 vtable+pointer 的开销总体上比最大和最小对象之间的大小差异(根据 sizeof 至少为 200 字节)小得多。由于通常可以使用最小的对象而不是最大的对象,并且可能存储了数千万个对象,因此可以节省几千兆字节的内存使用量。然后可以非常快速地搜索结果,因为基类包含找到正确项目所需的信息,然后可以 dynamic_cast 返回到它的真实类型。它在大多数情况下都运行良好。

唯一的问题是删除。当有数千万个对象时,释放所有内存需要几秒钟。删除代码遍历每个对象并调用虚拟析构函数的 delete results[i]。虽然并非不可能变通,但我认为必须有更优雅的解决方案。

这绝对可以通过分配较大的连续内存块(使用 malloc 或类似的)来完成,这些内存块会被跟踪,然后某些东西会生成指向 block 内下一批空闲内存的正确指针。然后将该指针存储在 vector 中。要释放内存,需要对较少数量的大块调用 free()。没有更多的 vtable(并且可以用更小的类型字段替换它以确保正确的转换),这也节省了空间。虽然它非常像 C 风格的解决方案,但并不是特别漂亮。

对于我忽略的这类问题,是否有 C++ 风格的解决方案?

最佳答案

您可以为您的类重载"new"运算符(即 void* VirtualSmall::operator new(size_t) ),并实现它们以从自定义分配器获取内存。我会为每个派生类使用一个 block 分配器,这样每个 block 大小都是它应该存储的类的倍数。

当需要清理时,告诉每个分配器释放所有 block 。不会调用析构函数,因此请确保您不需要它们。

关于c++ - 多态数据存储的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17735679/

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