我有一个带有网格的游戏,它是一个二维数组。该数组填充了信息结构。
struct GridCell
{
uint mCellID;
Vector2 mPosition;
uint mLevel;
int mCellType;
};
class Grid
{
public:
Grid();
~Grid()
protected:
// Heap
GridCell[][] mGridCells;
// Dynamic
GridCell*[][] mGridCells;
};
请记住,内存中可以同时存在许多网格,并且这些网格单元的范围可以从非常小到非常大: 这更适合作为网格单元堆还是动态(指针)网格单元?
据我了解: 堆单元会占用大量内存 动态单元仍然会,但它将是指针,而不是整个结构。但是,这会导致内存碎片吗?
我不确定哪一个最适合这种情况,而且我可能也不完全理解两者之间的差异。帮助?
最佳答案
C++ 中的类型具有固定大小。您的 GridCell
是不正确的s 的范围从非常小到非常大。他们将是其中之一。 sizeof(GridCell)
是固定的。它们可能各自指向不同大小的对象,但这些对象不是 GridCell
大小的一部分。 .
无论哪种方式,您提出的两种方法都将具有完全相同数量的 GridCell
s 在内存中,因此使用指针不会保存任何内容。事实上,动态分配的方法将使用更多的内存,因为您还存储指向每个单元格的指针。指针方法可以提高内存效率的唯一方法是使用单个 GridCell
对象来表示 Grid
中的多个单元格。也就是说,某些指针是相同的。
这真正归结为哪一个更易于管理,答案始终是“没有指针的方法”。这意味着你的Grid
对象会自动管理GridCell
的构建和销毁无需您关心它,帮助您避免内存泄漏。如果使用指针方法,则必须在 Grid
的构造函数中循环遍历数组。 ,做new GridCell()
对于每个元素。您还需要在析构函数中执行相同的操作,执行 delete
在您动态分配的每个单元格上。这是一种痛苦,尤其是在不必要的情况下。
在需要指针的情况下,智能指针更可取。
此外,使用 std::array<std::array<GridCell, N> M>
可能会更好。对于固定大小的数组。它为您封装了数组,允许您像使用标准库中的任何其他容器一样使用它。
关于c++ - 指针或堆对象的二维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13962832/