基本的に、C++ 最適化 (/O) とプログラム全体の最適化 (/GL) とは何かを知りたいです。
深い説明をいただければ幸いです。
ありがとう
基本的に、C++ 最適化 (/O) とプログラム全体の最適化 (/GL) とは何かを知りたいです。
深い説明をいただければ幸いです。
ありがとう
プログラム全体の最適化は、モジュール間最適化の 1 つの側面です。これは、これらの言語のコンパイル モデルにより、C および C++ のコンテキストではリンク時の最適化とも呼ばれます。
基本的に、プログラムのソース コード全体が、ソース ファイル、ヘッダー ファイル、ライブラリ ファイルなど、すべて 1 つのファイルに貼り付けられていると想像してください。その仮想的なケースでは、コンパイラーには、インライン化、デッドコードの削除、重複排除など、最適化のための多くの追加の機会があります。
クロスモジュール最適化とは、C および C++ コンパイラで慣例となっている従来の一度に 1 TU のコンパイル内であっても、そのような最適化を可能にしようとする任意の手法を指します。通常、これには追加情報 (場合によっては解析されたソース コンテンツ全体) を個々のオブジェクト ファイルに追加し、リンカがアプリケーションのすべての要素オブジェクト ファイルを確認したら、特定のコンパイル タスクを実行できるようにする必要があります。
MSVC はいわゆるOptimizing Compilerです。OC は、メモリ フットプリントを最小化するか、実行速度を最大化するか、またはその両方を行うために、ユーザーが記述したコードを取得し、その一部を再書き込みします。これは、コードが実行されるプラットフォームに関する深い技術的知識を活用することによって行われ、通常は特定の命令セットを対象とします。
MSVC、GCC、LLVM などの OC はすべて、これを実現するためにさまざまな手法を利用しています。テクニック自体は、インターネットの投稿で説明できる範囲をはるかに超えています。しかし、心に留めておくべきことがいくつかあります。
最適化されたプログラムは、最適化されていないプログラムよりもデバッグがはるかに困難です。実行順序とプログラム内の局所性の両方の観点から多くのコードが移動され、シンボルが取り除かれている可能性があります。
一般に、標準では、プログラムの観察可能な動作が " AS-IF "と同じである限り、変更が加えられていない限り、コンパイラがプログラムに任意の変更を加えることを許可しています。
コードの最適化を担当するコンパイラの部分は、非常に優秀な人々の専任チームによって長年にわたって設計および作成されてきました。最終結果は、概して、コードの最適化において、これまで期待していたよりもはるかに優れたコンパイラです。原則として、2 つの理由から、独自のマイクロ最適化を実装しようとしても無意味です。1 つは、一般的にコンパイラがより適切な処理を行うことができるということです。2 つは、記述したマイクロ最適化によって、コンパイラが独自の最適化を実装する能力を混乱させることです。コードを手作業でマイクロ最適化すると、実際にはプログラムのパフォーマンスが低下する可能性があります。
プログラム全体の最適化は、Visual Studio では LTCG と呼ばれます - Link Time Code Generation - ここにLTCGに関する記事があります。