2

我有一个有网格的游戏,它是一个二维数组。这个数组填充了一个信息结构。

struct GridCell
{
    uint mCellID;
    Vector2 mPosition;
    uint mLevel;
    int mCellType;
};

class Grid
{
public:
    Grid();
    ~Grid()

protected:
    // Heap
    GridCell[][] mGridCells;

    // Dynamic
    GridCell*[][] mGridCells;
};

请记住,内存中可以同时存在许多网格,并且这些网格单元的范围可以从非常小到非常大:这更适合作为网格单元堆还是动态(指针)网格单元?

据我了解:堆单元将占用大量内存动态单元仍然会,但它将是指针,而不是整个结构。但是,这会导致内存碎片化吗?

我不确定哪一个最适合这种情况,而且我可能也不完全理解两者之间的区别。帮助?

4

2 回答 2

3

C++ 中的类型具有固定的大小。您GridCell的 s 范围从非常小到非常大是不正确的。他们将是其中之一。sizeof(GridCell)是固定的。它们可能每个都指向不同大小的对象,但这些对象不属于GridCell.

无论哪种方式,您提出的两种方法都将在内存中具有完全相同数量的GridCells,因此使用指针不会保存任何内容。事实上,动态分配的方法将使用更多内存,因为您还存储了指向每个单元格的指针。指针方法可以提高内存效率的唯一方法是,如果您使用单个GridCell对象来表示Grid. 也就是说,一些指针将是相同的。

这真正归结为哪个更易于管理,答案始终是“没有指针的方法”。这意味着您的Grid对象将自动管理GridCells 的构造和销毁,而无需您关心它,从而帮助您避免内存泄漏。如果使用指针方法,则必须在 的构造函数中循环遍历数组Gridnew GridCell()对每个元素执行此操作。您还需要在析构函数中执行相同的操作,在delete您动态分配的每个单元格上执行此操作。这是一种痛苦,尤其是在不必要的时候。

在需要指针的情况下智能指针更可取。

此外,对于固定大小的数组,您甚至可能会更好std::array<std::array<GridCell, N> M>。它为您封装了数组,允许您像使用标准库中的任何其他 Container 一样使用它。

于 2012-12-19T23:21:58.560 回答
2

最好都不使用而使用 std::vector。将您的二维数组设为 1d 并将值直接存储到向量中。或者,如果你真的必须有二维,你可以创建一个向量向量。

于 2012-12-19T23:21:26.717 回答