2

共有ライブラリを含むアルゴリズムのC実装があります。共有ライブラリのパフォーマンスは、CとC ++ではかなり異なります(C ++でははるかに優れています)。そのため、C実装( Imp-1 )の共有ライブラリ部分をC ++(Imp-2)に変更し、残りの部分は同じままにしました。Linuxでgccとg++を使用して、それぞれImp-1Imp-2をコンパイルしました。小さなサイズの問題では、Imp-1Imp-2の両方がまったく同じように動作します。ただし、同じ大きなサイズの問題では、Imp-1が問題なく解決するのに対し、Imp-2はstd::bad_allocを返します。エラー。興味深いことに、このエラーは、メモリ使用量が4GBに増加し、使用可能なメモリが35GBの場合に発生します。

なぜこのエラーが発生するのですか?(コンパイラ、オペレーティングシステム、コンパイラオプションなど)

よろしくお願いします。

4

1 に答える 1

1

gccは64ビットコンパイラのようですが、g++は32ビットコンパイラです。32ビットシステムで実行している場合でも、64ビットコンパイラでプログラムをコンパイルしない限り、プログラムは64ビットアドレス指定機能を十分に活用できず、4GBを超えるアドレス指定が必要な場合に発生するbad_allocが発生します。

あなたが64ビットで32ビットのコンパイル済みプログラムを実行していると私が確信している理由は4GBの制限です。一般的に、メモリはユーザー/カーネルスペースとして分割され、32ビットシステムでは4GB全体を使用できません。通常は2GBから3GBの間です。4GB全体に対応できるため、64ビット環境で32ビットプログラムを実行しているようです。

于 2012-04-29T08:38:57.067 に答える