37

新しいC++11標準では、inlineキーワードよりもconstexprキーワードをいつ使用する必要がありますか?constexprキーワードは、に対して追加の最適化を提供しますかinline、それともコンパイル時に計算する必要があると主張するだけですか?

非変数のconstexpr呼び出しなど、呼び出しが一定でない場合にGCCで機能するのはなぜですか?これはGCCのバグですか、それとも実際には標準の一部ですか?foo(x)constexpr

4

3 に答える 3

44

コンパイル時に何かを計算できると主張すること、かなり強力な最適化です。

インライン化は、関数本体を呼び出しサイトにコピー/貼り付けすることにより、関数呼び出しを削除するだけです。関数本体はまだ実行する必要があります。関数呼び出しのオーバーヘッドを節約するだけです。

しかし、同じコードをコンパイル時に評価すると、実行時にフリーになります。

しかし、どちらinlineに最適化に関するものでconstexprはありません。の主な目的は、ヘッダーで関数を定義できるように、1 つの定義規則を抑制することです (これはテンプレートに役立ち、インラインの最適化も容易になります)。inline

そしてconstexpr、それはメタプログラミングに有用であり、付随的に、より多くの計算をコンパイル時に移動することにより、コンパイラがコードをより適切に最適化するのに役立つ可能性があるためです。

于 2011-08-18T20:59:06.010 に答える
4

ウィキペディアを引用するには:

C ++ 0xではキーワードconstexprが導入されます。これにより、ユーザーは関数またはオブジェクトのコンストラクターがコンパイル時定数であることを保証できます。

関数が非常に短い場合は、関数をインラインでマークします。コンパイル時に結果が必要な場合は、関数をconstexprとしてマークします。(テンプレートパラメータまたは配列サイズ)。必要に応じて、機能は両方になり得ると思います。

定数式の関数またはコンストラクターは、constexpr以外のパラメーターを使用して呼び出すことができます。constexpr整数リテラルを非constexpr変数に割り当てることができるのと同様に、constexpr関数を非constexprパラメーターで呼び出し、結果を非constexpr変数に格納することもできます。このキーワードは、式のすべてのメンバーがconstexprである場合にのみ、コンパイル時の不変性の可能性を考慮に入れています。

したがって、GCCはこれで正しくありません。

于 2011-08-18T21:57:21.123 に答える