【问题标题】:Managing memory in 3d array of polymorphic classes在多态类的 3d 数组中管理内存
【发布时间】:2014-01-26 17:11:50
【问题描述】:

我有一个问题,也许有人可以帮忙解决。 如果可以的话,非常感谢!

我正在尝试存储一个包含许多小对象的三维数组。 所有这些对象类都将继承自一个父类。

理想情况下,我正在查看一个 32x32x32 的对象数组,每个对象不太可能超过 8 个字节。 因此,32768 个对象,每个对象最多 8 个字节 = 256kb

但是其中一些不需要 8 个字节的数据,在某些情况下只需要一个字节的数据。

问题在于,这些对象中的每一个都将根据它们的本质具有一组不同的行为。因此,如果我调用 (obj.print()),每个人的行为都会有所不同。

这本身很容易通过创建继承通用接口类的子类来解决。然而,因为它们被大量存储在 3d 数组中,将它们存储为指针会自动增加另外 4 个字节的开销 - 8 个字节用于数据类型,4 个字节用于指向它的指针。 平均而言,即使某些对象小于 8 字节,内存开销仍会增加至少 30% 的使用率。

这本身并不是一个问题,直到我开始存储这些数据块中的许多 - 然后内存成为一个相当严重的问题。

从长期可维护性和代码管理的角度来看,这确实是最好的方法。但是我来到这里的聪明人那里,看看你是否有任何可以分享的智慧珍珠! :)

谢谢, 布赖恩

【问题讨论】:

  • 您可以高效地实现自己的可区分联合。
  • 内容是多态的,引用来自同一公共基础的不同派生的实例在同一个容器中,会在一定程度上限制您的选择。
  • 占用一个字节的多态对象是一种理论上的可能性,标准并未禁止,但您必须稍微了解一下实际可以做到这一点的实现。

标签: c++ arrays pointers memory-management polymorphism


【解决方案1】:

如果你坚持运行时多态性,我有个坏消息要告诉你——你将使用指针,这会增加一些内存开销。

就 1 字节多态结构而言,当您的成员函数是虚拟的时会添加一个 vtable 指针,所以我不完全确定您将如何实现它们。

如果你可以放弃多态性,std::tuple 可能是一个替代方案。对其进行迭代或使用 32^3 个元素对其进行初始化可能会有问题,但使用模板可能是可行的,具体取决于您可能想要实现的目标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    相关资源
    最近更新 更多