C++ 指针或堆对象的二维数组
我有一个游戏有一个网格,它是一个2D数组。此数组填充了一个信息结构C++ 指针或堆对象的二维数组,c++,arrays,memory-management,C++,Arrays,Memory Management,我有一个游戏有一个网格,它是一个2D数组。此数组填充了一个信息结构 struct GridCell { uint mCellID; Vector2 mPosition; uint mLevel; int mCellType; }; class Grid { public: Grid(); ~Grid() protected: // Heap GridCell[][] mGridCells; // Dynamic
struct GridCell
{
uint mCellID;
Vector2 mPosition;
uint mLevel;
int mCellType;
};
class Grid
{
public:
Grid();
~Grid()
protected:
// Heap
GridCell[][] mGridCells;
// Dynamic
GridCell*[][] mGridCells;
};
请记住,内存中一次可以有许多网格,这些网格单元的范围可以从非常小到非常大:
这更适合作为GridCell堆还是动态(指针)GridCell堆
据我所知:
堆单元将占用大量内存
动态单元仍然会,但它将是指针,而不是整个结构。但是,这会导致内存碎片吗
我不确定哪一个最适合这种情况,我可能也不完全理解两者之间的区别。帮忙 最好两者都不使用,而使用std::vector。将2d数组设为1d,并将值直接存储到向量中。或者,如果你真的必须有2个维度,你可以创建向量向量。C++中的< < P > >类型有固定的大小。您的
GridCell
s的范围从非常小到非常大,这是不正确的。他们将是一个或另一个sizeof(GridCell)
是固定的。它们可能各自指向不同大小的对象,但这些对象不是GridCell
大小的一部分
无论哪种方式,您提出的两种方法在内存中的GridCell
s的数量都是完全相同的,因此使用指针不会保存任何内容。事实上,动态分配的方法将使用更多的内存,因为您还存储指向每个单元格的指针。指针方法提高内存效率的唯一方法是使用单个GridCell
对象来表示网格中的多个单元格。也就是说,一些指针是相同的
这实际上归结为哪一个更易于管理,答案总是“没有指针的方法”。这意味着您的Grid
对象将自动管理GridCell
的构造和销毁,而无需您关心它,从而帮助您避免内存泄漏。如果使用指针方法,则必须在Grid
的构造函数中循环数组,对每个元素执行new GridCell()
。您还需要在析构函数中执行相同的操作,对动态分配的每个单元格执行delete
。这是一种痛苦,尤其是在没有必要的时候
在需要指针的情况下,智能指针更可取
此外,对于固定大小的阵列,使用std::array
可能会更好。它为您封装了数组,使您可以像使用标准库中的任何其他容器一样使用它。这里可能不关心这个问题,但需要注意的是,如果向量向量足够大,并且需要相对频繁地迭代,那么向量向量向量可能会导致糟糕的性能。数据的局部性可能很可怕。一个更好的选择是使用一个较大的向量,并手动计算到子“数组”的偏移量。