4

私はいくつかの非常に大きなアレイ処理を行っています。私は次のグローバル宣言を行います:

`float array[200][1600][811];`

MS Visual Studio 2010でソリューションをビルドすると、次のエラーが発生します

LINK : fatal error LNK1248: image size (F85C8000) exceeds maximum allowable size (80000000)

今、私はこれが約1GBのプログラムメモリに相当することを知っています。しかし、この宣言はfloat [50][1600][811]250MBの宣言に対して機能しました。デフォルトのスタックサイズは非常に限られていることを私は知っています。私がすでに試したことがいくつかあります。[プロパティ]->[リンカー]->[スタック予約サイズ]を使用して、VSのスタックサイズを増やしました。これは役に立ちませんでした。実行可能ファイルをx64モードで実行するように変更しました(最大2GBのメモリをアドレス指定すると言われています!)。これも役に立ちませんでした。

malloc私は自分のコードでそれらが必要であることを確かに知っているので、配列に対してを実行したくありません。スタック/ヒープメモリを利用できるように、それらをグローバル宣言にする必要がありました。内で宣言するとMain ()、メモリオーバーフローのエラーが発生します。

任意のポインタをいただければ幸いです。ありがとう。

4

2 に答える 2

4

x64 実行可能ファイルをビルドしている場合でも、リンカーには x86 ビルドに適した制限があるようです。それについてあなたができることはあまりありません。

唯一の解決策は、ヒープから割り当てることです。これは、元の宣言と同じように使用できるはずです。

typedef float partial_array[1600][811];
std::unique_ptr<partial_array> array = new partial_array[200];
于 2012-06-26T17:05:30.837 に答える
3

不利な立場にある場合malloc、すぐに明らかな 2 つの可能性があります。C++11 には便利な配列型があります。

std::array<std::array<std::array<float, 50>, 1600>, 811> matrix;

std::vectorまたは、ループを使用してすべての値を正しく初期化することを検討できます。

std::vector<std::vector<std::vector<float>>> matrix;
matrix.reserve(50);

for (size_t i = 0; i < 50; i++)
{
    std::vector<std::vector<float>> submatrix;
    submatrix.reserve(1600);

    for (size_t j = 0; j < 1600; j++)
    {
        std::vector<float> row;
        row.resize(811);

        submatrix.push_back(row);
    }

    matrix.push_back(submatrix);
}
于 2012-06-26T16:44:28.437 に答える