2

2D配列であるグリッドを持つゲームがあります。この配列には、情報の構造体が含まれています。

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

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

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

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

一度にメモリ内に多数のグリッドが存在する可能性があり、それらのグリッドセルは非常に小さいものから非常に大きいものまでさまざまであることに注意してください。これは、グリッドセルのヒープまたは動的(ポインター)グリッドセルに適していますか?

私が理解していることから:ヒープセルはメモリの大きなチャンクを占有します動的セルは依然としてそうなりますが、構造体全体ではなくポインタになります。しかし、これは断片化されたメモリにつながる可能性がありますか?

このシナリオにどちらが最適かはわかりません。おそらく、この2つの違いも完全には理解していません。ヘルプ?

4

2 に答える 2

3

C++の型のサイズは固定されています。あなたGridCellのが非常に小さいものから非常に大きいものまで及ぶというのは真実ではありません。それらはどちらかになります。sizeof(GridCell)固定されています。それらはそれぞれ異なるサイズのオブジェクトを指している可能性がありますが、それらのオブジェクトはのサイズの一部ではありませんGridCell

いずれにせよ、提案する両方のメソッドGridCellのメモリ内のsの量はまったく同じであるため、ポインタを使用しても何も節約できません。実際、動的に割り当てられたアプローチでは、各セルへのポインターも格納しているため、より多くのメモリーを使用します。ポインタアプローチがメモリ効率を高める唯一の方法は、単一GridCellのオブジェクトを使用して。内の複数のセルを表す場合ですGrid。つまり、いくつかのポインタは同じになります。

これが本当に重要なのは、どちらがより管理しやすいかということであり、答えは常に「ポインタのない方法」です。これは、Gridオブジェクトがsの構築と破棄GridCellを気にすることなく自動的に管理し、メモリリークを回避するのに役立つことを意味します。ポインタメソッドを使用する場合は、のコンストラクタで配列をループし、各要素に対してGrid実行する必要があります。動的に割り当てた各セルnew GridCell()で、デストラクタでも同じことを行う必要があります。deleteこれは、特に不要な場合は苦痛です。

ポインタが必要な場合は、スマートポインタの方がはるかに適しています。

std::array<std::array<GridCell, N> M>さらに、固定サイズのアレイにはを使用したほうがよい場合もあります。配列をカプセル化して、標準ライブラリの他のコンテナと同じように使用できるようにします。

于 2012-12-19T23:21:58.560 に答える
2

どちらも使用せず、std::vectorを使用することをお勧めします。2次元配列を1次元にし、値をベクトルに直接格納します。または、本当に2次元が必要な場合は、ベクトルのベクトルを作成できます。

于 2012-12-19T23:21:26.717 に答える