2017-12-13 47 views
2

フリー・ストア(つまりヒープ)割り当てを行わない標準アルゴリズムの非実行ポリシーオーバーロードについてC++標準で何か保証はありますか?C++アルゴリズムヒープ割り当て保証

私はリアルタイム処理を行っていますが、たとえばstd::max_elementなどを使用したいと考えていますが、ヒープに割り当てられない保証はありません。それは意味がありませんが、どこに指定されているか分かりません。おそらく私は、それを保証するいくつかの一般的な条項を欠いているでしょうか?

+1

これを参照してください:https://stackoverflow.com/a/41475062/748188 – Alireza

+0

'演算子+(int、int)'がヒープを使用しないという保証はありません。なぜあなたはより複雑なアルゴリズムのためのそのような保証を期待していますか? – MSalters

答えて

1

標準では、メモリを割り当てるアルゴリズムが禁止されています。アルゴリズムがメモリを割り当てるかどうかの知識は役に立つ/必要かもしれないので、この仕様の省略は欠陥とみなされるかもしれない(私はこのトピックに未解決の欠陥があるとは思わない)。メモリを割り当てることを許可されていないアルゴリズムを指定することは、これらの割り当てがそのパラメータの操作ではなく、アルゴリズム自身の操作のみをカバーすることが明らかである限り、それほど悪くはないはずです。メモリの割り当てが必要です。理論的には、一部のアルゴリズムが一時バッファから利益を得てメモリを割り当てることが考えられる。しかし、実際には、これを行うアルゴリズムがいくつか存在する(例えば、rotate()はメモリを割り当てることから利益を得ることができる)。 std::max_element()のようなアルゴリズムは、指定されていないにもかかわらずメモリを割り当てません。

+0

いくつかのアルゴリズム(例えば、 'std :: inplace_merge')では、一時記憶域(ヒープ記憶域)が利用可能である場合、複雑さの要件が明示的に変更されます。一時記憶域が 'std :: get_temporary_buffer'の主要な役割であることを提供します。 –

+1

@PeteBecker:同意します。しかし、 'std :: max_element()'では、追加のメモリを必要としません。追加のメモリの使用を明示的に禁止するように仕様が強化されているのであれば良いでしょうが、現在のところ実行できる最善の方法は合理的な前提を作ることです(またはアルゴリズムを使用しないでください)。 –

0

私はそのような保証について直接言及していませんでした。ただし、cppreferenceには、実行されていないポリシーのオーバーロードについては、std::max_elementの例外はありません。

実行ポリシーのオーバーロードにはstd::bad_allocが含まれています。

この情報が正しい場合は、実行されていないポリシーのオーバーロードがヒープにメモリを割り当てることができないことを意味します(そうでない場合は、bad::allocを投げる可能性があります)。

+2

それでも 'try catch 'を実行して割り当てなしで実装に戻すことができます;-) – Jarod42

+0

@ Jarod42 uh right、それを逃しました。しかし、それを行うのは厄介な方法であり、実装はしないことを願っています – user463035818

+0

標準の非実行ポリシーアルゴリズムに関する例外については何も言及されていません*正式に*は投げられない例外? – Danra

関連する問題