所以我需要一个包含2xx小地形(地面)的Terrain(地面)阵列。每个小地形(地面)包含1 000 000个浮点数。
所以我想到了像
这样的东西QVector<QVector<float> > terrain;
QVector<float> littleTerrain;
但是,我可以做的所有分配都存在问题。
当然,我想到了
QVector<float*>
但是有必要删除向量中的所有指针
那么,这里可以使用智能指针吗?否则,最好的选择是什么?
答案 0 :(得分:0)
float是4个字节,指针在32位配置中也是4个字节,因此没有必要为你的浮点数保存指针。向量可以用于您的目的,但您应该首先为您的向量保留内存。还尝试确定向量实现的限制。从库到库,实现可能有所不同。
答案 1 :(得分:0)
如果您只想支持64位架构,那么肯定会有一个向量列表。它的工作非常糟糕,因为可能没有足够的物理RAM来支持它。
在32位体系结构上,您没有足够的地址空间来将其全部保存在简单的数据结构中。
因此,您需要做的是一种缓存方案,其中只有该数据的一部分随时驻留在内存数据结构中。为了优化缓存行为,在所有级别(L1,L2,L3,分页),您需要 - 这很重要 - 保持相邻内存地址中的空间相邻数据。
这样做的一种方法是将所有地形细分为32x32单位正方形。请注意,32*32*sizeof(float) == 4096
是大多数系统上的小页面大小。该方块应进一步细分为4x4单位正方形。请注意4*4*sizeof(float) == 64
并且是许多系统上的缓存行大小。
答案 2 :(得分:0)
开销与您拥有的容器数量成正比 - 几百个容器,总共几千字节。换句话说,什么都没有。
重要的是为每个“littleTerrain”保留足够的内存数量。否则Qt会确保它适合,但可能会分配大约50%左右。