1. ホーム
  2. c++

[解決済み] noexceptを本当に使うべきはいつですか?

2022-03-16 15:59:20

質問

noexcept キーワードは、多くの関数シグネチャに適切に適用できますが、実際にどのような場合に使用を検討すべきなのか、よくわかりません。これまで読んできた内容からすると、直前になって追加された noexcept は、ムーブコンストラクタが投げるときに発生するいくつかの重要な問題に対処しているようです。しかし、私はまだ、いくつかの実用的な質問に対する満足のいく答えを提供することができません。 noexcept ということです。

  1. 絶対に投げないとわかっていても、コンパイラが勝手に判断できない関数の例はたくさんあります。このような場合 noexcept の関数宣言に のような場合ですか?

    を付ける必要があるかどうか考えなければならない。 noexcept の後に それぞれ 関数宣言は、プログラマの生産性を大きく低下させます(正直言って、面倒くさい)。どのような場面で noexcept また、どのような状況であれば、暗黙の了解である noexcept(false) ?

  2. を使用した後、現実的にいつ頃からパフォーマンスの向上が期待できるでしょうか? noexcept ? 特に、C++ コンパイラが noexcept .

    個人的に気になるのは noexcept というのも、コンパイラがある種の最適化を安全に適用するための自由度が高まるからです。最近のコンパイラは noexcept このように もしそうでなければ、近い将来そうなることを期待してもよいでしょうか?

解決方法は?

実際に使用するのに十分な時間がないため、これに対するベストプラクティスの答えを出すのは時期尚早だと思います。もしこれが、throw指定子が登場した直後に質問されたとしたら、答えは今とはまったく異なるものになったでしょう。

<ブロッククオート

を付ける必要があるかどうか考えなければならない。 noexcept は、プログラマの生産性を大幅に低下させるでしょう(率直に言って、苦痛です)。

じゃあ、その関数が絶対に投げないことが明らかなときに使ったらいい。

を使用した後、現実的にいつ頃からパフォーマンスの向上が期待できるでしょうか? noexcept ? [中略)個人的に気になるのは noexcept というのも、コンパイラがある種の最適化を安全に適用するための自由度が高まるからです。

をチェックできるため、コンパイラの最適化ではなく、ユーザーの最適化によって最大の最適化が得られると思われます。 noexcept とオーバーロードしてしまいます。ほとんどのコンパイラは、例外をスローしなければペナルティを課さないという処理方法に従っているので、処理コードを削除することでバイナリサイズを小さくできるかもしれませんが、あなたのコードのマシンコードレベルではあまり(あるいは何も)変わらないのではないかと思います。

使用方法 noexcept の4つです (コンストラクタ、代入、デストラクタはすでに noexcept が最も効果的であると思われます。 noexcept のようなテンプレートコードでは、チェックは「一般的」です。 std コンテナです。例えば std::vector とマークされていない限り、クラスの動きは使用されません。 noexcept (あるいはコンパイラがそうでないと推論できる)。