2014-01-26 24 views
0

我在这里有一个问题,有人可能能够帮助。 如果可以,非常感谢!用三维多态类数组管理内存

我试图存储一个包含很多小对象的三维数组。 所有这些对象类都将从一个父类继承。

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

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

问题是,这些对象中的每一个都会根据它们的内容有一组不同的行为。所以如果我调用(obj.print()),每个人的行为都会有所不同。

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

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

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

感谢, 布赖恩

+0

您可以高效地实现自己的区分联盟。 –

+0

内容是多态的,引用来自同一个容器*中相同公共基*的不同派生实例将会在某种程度上限制你的选择。 – WhozCraig

+0

占用一个单字节的多态对象是标准所不允许的理论上的可能性,但您必须查看*一点*来获得实际上可以实现的实现。 –

回答

0

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

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

如果你可以放弃多态性,std :: tuple可能是一个选择。迭代或者使用32^3元素初始化它可能会有问题,但是使用模板可能是可行的,具体取决于您想要实现的内容。