c++ - 指针或堆对象的二维数组

标签 c++ arrays memory-management

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

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/

相关文章:

.net - 使用/clr 编译时使用 boost 线程

c++ - 模板类中的静态成员

javascript - 如何通过 Angular 中 HTML 的方法调用来更改 JS 文件中的数组?

arrays - 有效地挑选一个唯一的号码

python - Pandas GroupBy 内存释放

c++ - 尽管有类继承,但仍无法访问变量?

c++ - 如何用C/C++打开和加载oracle fmb文件?

javascript - 获取 JavaScript 数组的键和值到变量中

C++ Array Allocation Segmental Fault 11 新手

c++ - 容器的 Qt 内存管理