4

C ++でのnewまたはmallocを使用した動的割り当てには、システムまたはその他の制限がありますか? システムは 64 ビットで、約 8 億個の構造体の配列を割り当てたいと考えています。

編集:以前に自分でテストしなかった理由は、現在十分なメモリを備えたマシンにアクセスできないため、現在のマシンでテストする意味がないと感じたためです。

独自のテストを実行した後、8 億要素を適切に割り当てることができますが、約 8 億 5000 万に達すると、malloc は NULL を返します。構造体には 7 つの float が含まれているため、合計サイズは約 22GB です。この一見恣意的な制限の背後にある理由は何ですか? このマシンには 4GB の RAM と 4GB の仮想メモリが搭載されているため、なぜそれほど多くのメモリを割り当てることができるのかわかりません。

4

3 に答える 3

3

コードを実行しようとする以外に、それを伝える方法はありません。

「ビット数」は、対象とする OS とアーキテクチャを示すだけです。また、C++ プログラムをサポートするすべての OS が標準 C++ ライブラリの独自の実装であるという事実も強調したいと思います (std ライブラリを使用している場合)。コーダーでは、std ライブラリに属する​​ヘッダーと名前空間を使用しているだけで、実際にコードを実行するために通常 OS に付属している C/C++ ライブラリに依存しています。

また、テスト部分に依存し、メモリの使用を最小限に抑えることをお勧めします。一部の OS にはアンチオーバーフロー テクノロジなどもあるため、一部の OS は大規模な割り当てをシステムの安定性に対する脅威と見なす可能性があります。 RAM の大量使用には、X86 アーキテクチャでは通常のように、メモリ コントローラーの大きな役割も伴います。通常、実行しようとしているのは良いことではなく、悪い結果になるか、本当に特定のマシンと OS を使用することになります。作成しようとしているこのアプリケーションのお気に入りのターゲット。

最後に、あなたは C++ コードではなく C コードを書こうとしています!

malloc()はCの世界の関数であり、直接割り当てや割り当て解除などの直接メモリ管理も伴います。ハードウェアも多くのことを実行する必要があります

std vector のような実際の C++ 構造 (パフォーマンスのリストよりも優れています) に切り替えるか、C# や Java のような直接メモリ管理フェーズを持たず、独自のガベージ コレクターを備えた言語に切り替えることをお勧めします。

あなたの質問への答えはノーです。実用的な観点からも、コードの最適化に関して大きな問題に直面することになるでしょう。おそらく、C++、C#、または Java などの別の言語を使用すると、生活が楽になるでしょうが、通常、ガベージコレクターはメモリを大量に消費することに注意してください。おそらく、あなたの場合の最良の解決策は、少し余分な労力とテストフェーズを備えたC++になるでしょう。

于 2012-06-25T23:24:32.777 に答える
3

制限は、おおよそ、空き RAM にディスクへのスワップに許可されているスペースを加えたものです。記録としては 8 億バイト = 800 Mb なので、小さな構造体で安全側に座ることができます。スワッピングさえ必要ないかもしれません (そして避けるべきです) 試してみて、クラッシュする場所を確認してください ;-)

64 ビット: 2^64/2^30 = 約。17* 10⁹ ギガバイト (バイト アドレス指定可能なアーキテクチャの場合、1Gb=2^30 ビット) なので、ここで心配する必要はありません

32 ビット: 2^32 = 約 4 ギガバイトなので、ここでも安全な側にいることができます

符号付きの値を 2 で割りますが、少なくとも 64 ビット システムではまだ多くの余地が残っています。

于 2012-06-25T23:01:28.547 に答える
0

動的割り当ての場合、静的割り当ての場合と同じ制限が適用されます。たとえば、使用可能なメモリの量のみに制限されます(ポインタのサイズによって制限されます)。32ビットシステムと64ビットシステムの主な違いは、ポインターのサイズです。32ビットシステムでは、32ビットポインターに制限されます。たとえば、4294967296バイト(4GB)にアクセスできます。システムはその一部を予約しているため、最終的には約2.5GBになります。64ビットシステムでは、2 ^ 64 = 16エクサバイトであり、実際には約256テラバイトから4ペタバイトです。あなたが必要とするよりもはるかに。ただし、十分なメモリがない(そして十分なスワップスペースがない)場合は、クラッシュする可能性があります。

于 2012-06-25T23:19:44.893 に答える