質問

Boost :: Multi_Arrayコンストラクターまたはサイズ変更メソッドがBAD_ALLOC例外をスローできるかどうか(または割り当てまたはサイズ変更が失敗したことを示す他の例外)を把握しようとしています。ドキュメントにはどこにもこの情報が見つかりません。

明確化(コメントから追加):

これは、割り当てが失敗した場合、メモリ集中(遅い)方法に戻ることができる科学的アルゴリズムです。基本的に、2つの動的に割り当てられた3次元アレイがあり、クエリ内のすべての遺伝子のペアと、多数のデータセットのそれぞれの交差検証セットのすべての遺伝子の間に「距離」(相関)を保持します。遅い方法は、必要に応じてその場で各距離を再計算します。これは、既存のJava実装のC ++バージョン用であり、両方の方法を実装し、メモリのない例外に頼ります。私は本当に記憶を使い果たすことを期待していません。

役に立ちましたか?

解決

1日: (本当の質問に答える):動的に割り当てられたメモリを使用するので、はい、投げることができます std::bad_alloc (ブースト翻訳を見たことがありません std::bad_alloc 例外;そうするのはおかしいでしょう)。

2番目: (明確化に関するコメント):実行時にアルゴリズムのパフォーマンスを最適化するために、利用可能な物理メモリの情報が必要です。ただし、頼ることはできません std::bad_alloc 最新のオペレーティングシステムがそのようなものを使用しているため、利用可能なメモリの量を判断するために オーバーコミット, 、意味:彼らは(ほとんど)失敗した割り当ての試みを決して返しませんが、代わりに「メモリ」を与えるだけです。

Javaでは、VMがあなたのために多くのことをしているので、これは機能するかもしれません:それはいくつかの連続記憶チャンクを割り当てようとし、利用可能な物理メモリに関してそれを行い、利用可能なものについてそうします 未使用 物理的記憶GCをもっと強調するかどうかを決定するか、より大きなジャンクを割り当てるかを決定します。また、パフォーマンスの理由から、仮想メモリと物理メモリはまったく異なる概念であることを考慮する必要があります。

もし、あんたが 必要 パフォーマンス - そのような場合(仕事の分野に応じて必要な場合がある)パフォーマンスを最適化するには、「現実世界」がどのように見えるかを示すプラットフォーム固有の機能を検査する必要があります。

他のヒント

明示的な例外仕様がないことは意図的です。見る これ 説明のためのサブセクション。さらに、明示的な仕様がないことは、関数がスローできる例外のタイプに制限がないことを意味することに注意してください。したがって、少なくとも、CTORとサイズ変更関数は、メモリが使い果たされた場合、またはアイテムオブジェクトのコピーが失敗した場合に例外をスローできます。

あなたが興味を持っているかもしれないブーストに影響を与えたいくつかの一般的な参照は次のとおりです。

テストしてみませんか?例外を生成するために、不条理に高い価値を渡すのは簡単です。

一方、この例外を生成する場合、何をするつもりですか? std::bad_alloc あなたが通常マイクロレベルで対処できない種類の例外です...

たとえば、Webサーバーでは、通常、クリーンアップ(DBトランザクションのロールバック?)を実行してから返します。 500 ユーザーへのエラー。

しかし、メモリが使い果たされたとき、あなたがもう一度近くにあることがわかっているメモリウォールにもう一度ぶつけたくない場合は慎重に踏まなければならないので、安全にできることはたくさんありません:)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top