7

noexcept指定子とコンパイラの最適化に関する不明確なことを読みました。noexceptコンパイラを指定すると、次のことが最適化される場合があります。

  • コンパイル時間(より高速なコンパイル)。
  • 実行時間(コードの実行速度が速くなります)。
  • または両方?
  • またはなし?
4

1 に答える 1

8

noexpect の本来の理由は、呼び出し元の関数が仕様によってスローを許可されていない場合に、ライブラリがより高速な move-constructors を内部で使用できるようにすることでした。

次に、タイプのムーブ コンストラクターとムーブ割り当てに noexcept アノテーションが付けられている場合、STL ベクトルなどのコンテナーでパフォーマンスを大幅に最適化できます。STL ユーティリティ std::move_if_noexcept は、移動がスローされないことを検出すると、一部の操作 (サイズ変更など) に対してコピーではなくこれらの安全な移動を使用します。これにより、数百万の要素を格納するコンテナーの場合、大幅な最適化が可能になります。

( using-noexceptから引用)


さらに、コンパイラは、noexpect 指定子が原因でスローされる例外がないことがわかっている場合、スタックの巻き戻しのために追加のコードを生成する必要はありません。


コンパイル時間が noexcept-specifiers によってどのように実質的に影響を受けるかわかりません。ただし、実行時間は大幅に短縮されます。

于 2013-03-17T13:42:36.290 に答える