コンパイルはオンザフライで実行されます。プログラムで実際に使用されているCImg機能のみがコンパイルされ、コンパイルされた実行可能プログラムに表示されます。これにより、未使用のものがなく、非常にコンパクトなコードになります。
誰もが原理を知っていますか?
CImg はヘッダーのみのライブラリであり、彼らが参照しているものであるテンプレートを自由に使用します。
彼らが何らかのプリコンパイル済みライブラリ (.dll/.lib/.a/.so) を使用した場合、ライブラリ ファイルには、実際に使用するビットに関係なく、CImg ライブラリ全体が含まれている必要があります。
静的にリンクされたライブラリ (.lib または .a) の場合、リンカーは未使用のシンボルを取り除くことができますが、これは最適化設定に依存する場合があります。
ライブラリ全体が 1 つまたは 2 つのヘッダーに含まれている場合、実際にコンパイルされるのはそのときだけです#include
。したがって、それはプログラムの残りの部分と同じコンパイル プロセスの一部であり、コンパイラはライブラリのどの部分が含まれているかを簡単に判断できます。使用されているものと使用されていないもの。
また、CImg API はテンプレートを使用するため、呼び出されない関数のコードは生成されません。
ただし、他の回答が指摘しているように、未使用のシンボルは通常とにかく取り除かれるため、彼らはそれを少し売り過ぎています。
私にはかなり標準的な動作のように思えます.C++リンカーは通常、呼び出し不可能なコードを含めるのではなく、未使用のライブラリ参照をすべて破棄します。同様に、最適化されたビルドには、呼び出し不可能なコードは含まれません。
これは MSVC のリンカ コマンドのように聞こえますがEliminate Unreferenced Data (/OPT:REF)
、GCC にも同様のものが必要です。