コンストラクター Foo(int) を使用してクラス Foo を作成するとします。そして、私はこのコードを持っています:
Foo a(i), b = a + Foo(2);
コード内で定数を使用してコンストラクターを呼び出した場合、コンパイラーはコンストラクターを 1 回実行し、結果を実行時に保存しますか?それとも実行時に実行されますか?
これには 2 つのレベルがあります。
- 完璧なオプティマイザーの標準に関しては可能であり、合法的ですか?専門家が無制限の努力と天才で潜在的に行うことができるすべてを達成します-これをコンパイル時に行うこと、および
- 標準で必要/保証されているコンパイル時の動作です。
i
コンパイル時間は一定ですか?そうでない場合、i
渡された値がFoo::Foo(i)
その動作に影響を与える (データ メンバーの値に影響するか、ロギングなどの副作用に影響する) 場合、コンパイル時に Foo(i) を構築することは本質的に不可能であることは明らかです。が定数の場合i
でも、本質的に不可能な場合があります。たとえば、コンストラクターの実装が現在の時刻に基づいて動作する場合や、他のランタイム データを参照する必要がある場合などです。このような問題はFoo(2)
、コンパイル時に評価できない場合もあります。
i
が一定で、Foo
のコンストラクターが他の実行時のみのデータに依存しない場合、最適化することができます。しかし、あなたのコードには、C++ 標準が最適化を試みることさえ必要とするものは何もありません。同じことが s+
で呼び出される演算子にも当てはまりFoo
ます...最適化することは合法かもしれませんが、確かに必須ではありません。
Foo(i)
実際には、現在の主流のコンパイラのほとんどがfor compile-time constantの単純なケースを最適化することを期待してi
いますが、追加を解決することによって挑戦されます。本当に知りたい場合は、さまざまな最適化レベルでコンパイラを試してみてください....
実行時に実行されると仮定すると(私はそうなると思います)、コンパイル時に実行する方法、または実行した場合と同じ効果を持つ方法はありますか?
はい... からいくらかのマイレージを取得できます。constexpr
これは、C++ 11 で導入されたキーワードであり、コンパイル時に特定の値を解決する必要があることをコンパイラに伝えます (constexpr
コンパイラが必要としない変数/値の場合)コンパイル時にサポートすると、エラーが報告されます)。
次に、テンプレートを使用してコンパイル時の操作を表現できることがよくあります。その方向で自分自身を開始するには、「C++ テンプレート階乗コンパイル時間」などを検索して、基本的な計算をコーディングする方法を確認することをお勧めします。