1

Microsoft Visual Studio-2005 コンパイラを使用して C コードを作成しているときに、1 つの問題に直面しました。

大きなバッファを次のように静的に宣言しようとしました:

int gbl_data[4096*4096*256]; 

編集: この宣言は、ヘッダー ファイル内のグローバル変数でした。

「<strong>定数サイズ 0 の配列を割り当てることはできません」というコンパイル エラーが発生していました。

どういうわけか、4096X4096X256 のサイズが MAX_INT_LIMIT サイズ (2^31) よりも大きくなりすぎて、ラップアラウンドして –ve 程度になる可能性があることを意味します。しかし、それは「負の添え字」としてエラーを与えるべきでした。

定数を 4096UL x 4096UL x 256UL としてキャストしようとしましたが、それでも同じコンパイル エラーです。

このエラーの原因は何ですか?

この大きなサイズのバッファを割り当てるには、物理​​メモリのサイズが不足しているためですか、それとも何ですか?

それに対する修正は何ですか?

ありがとうございます。

-GM。

4

2 に答える 2

9

配列のサイズは int ではなく、unsigned int です。unsigned int の最大値は 4294967295 です。もう 1 つ取得したため、0 にラップします。

long はほとんどのプラットフォームで 32 ビット整数であるため、定数を long としてキャストしても何も変わりません。

代わりに long long を試すこともできますが、ここで別の小さな問題が発生します。

40 億の整数を割り当てようとしています。32 ビット CPU には 40 億バイトのメモリ空間があります。存在できる理論上の最大メモリ量の 4 倍を割り当てようとしています。(16ギガバイト)

それで、製図板に戻ります。なぜこれをやろうとしたのか、代わりに何ができるのかを考えてください。

于 2009-05-26T12:00:09.693 に答える
0

2^32 (または 32 ビット システムではアドレス空間の 4 倍) の配列を静的に割り当てようとしています。コンパイラは 4096 * 4096 * 256 (私の頭では 0x10000 です) を 32 ビット値に切り捨てているようです。

プラットフォームによっては、unsigned long も 32 ビットであり、切り捨てられる場合もあります。

64ビットプラットフォーム用にコンパイルしていることを確認するか(それが意図している場合)、アルゴリズムを変更してメモリを動的に割り当てる(明らかにアドレス空間を超えない)か、ファイルをオンにして中華鍋を使用することをお勧めしますディスク。

于 2009-05-26T12:01:41.047 に答える