8

私は Visual Studio 2010 Win 8 を使用しています。ゲームのゲーム データを保持する 2D 配列を作成するクラスがあります。

空のコンソール アプリを作成し、main.cpp を作成して、このコードを追加します。MAP_SIZE に 360 を使用すると、359 を使用してもスタック オーバーフローが発生しません。これはなぜでしょうか?私ははるかに大きなサイズの配列を探しています。理想的には 2000 ~ 10,000 のようなものが欲しいです。

#define MAP_SIZE 360

typedef unsigned short ushort;
typedef unsigned long ulong;

struct Tile
{
    ushort baseLayerTileID;
    ulong ownerID;
};

class Server
{
private:
    Tile _map[MAP_SIZE][MAP_SIZE];
};


int main()
{
    Server s;

    return 0;
}
4

5 に答える 5

8

私の見積もりsizeof(Tile)は8以上です。つまりsizeof(Server)、少なくとも 360*360*8 = 1036800、つまり 0.99 MB です。通常、スタックは小さく、1MB が一般的なデフォルト サイズです。おそらく を使用して、代わりにヒープにタイルを割り当てる必要がありますstd::vector

class Server
{
public:
    Server() : _map(MAP_SIZE * MAP_SIZE) {}
private:
    std::vector<Tile> _map; // position [i][j] is at [i*MAP_SIZE+j]
};
于 2012-12-20T18:11:39.767 に答える
5

スタックに 360 x 360Tileオブジェクトの配列を割り当てています。これは最初から悪い考えです。スタック上に非常に大きなメモリ ブロックが割り当てられています。スタックは、このタイプの使用を意図していません。

このメモリは、必要なインスタンスが 1 つだけでサイズが事前にわかっている場合は静的にするか、ヒープから割り当てる必要があります (newまたは を使用してmalloc())。

自分のやり方ではなく、コンストラクタをServer使用してメモリを割り当てることを検討してください。new

于 2012-12-20T18:12:11.637 に答える
4

スタックのサイズには制限があります。大きな配列を保持する必要がある場合は、動的割り当てを使用してください。

于 2012-12-20T18:10:46.343 に答える
4

インスタンスごとに最大 1MB のスタック スペースを必要とする型を作成しましたが、これは明らかにスタックが対応できる容量を超えています。

  • 移植可能なオプションは、固定配列から動的に割り当てられた配列またはベクター型に変更することです。
  • 移植性のないオプションは、アプリケーションのスタック サイズを大きくすることです (これにより、すべてのスレッドのスタック サイズが大きくなります)。
于 2012-12-20T18:11:54.007 に答える