複数のファイルを使用すると、コードがはるかに簡単になることを私は知っています。ただし、「すべてを1つのファイルに詰め込む」間にパフォーマンスの違いがありますか、それともgccのような最新のコンパイラは両方に同じバイナリを作成しますか? パフォーマンスの違いとは、ファイル サイズ、コンパイル時間、および実行時間を意味します。
これは C のみです。
おそらく、変更されたファイルのみを再コンパイルする必要があるため、コンパイル時間は複数のファイルで改善されます (適切な依存関係追跡ビルド システムがあると仮定します)。
やるべきことはまだあるので、リンクにはおそらくもっと時間がかかります。
従来、コンパイラは複数のソース ファイルにわたって最適化を実行できませんでした (関数のインライン化などは注意が必要です)。そのため、結果として得られる実行可能ファイルは異なる可能性があり、潜在的に遅くなります。
すべてが単一のファイルにある場合、最適化の機会が増えます。たとえば、 で始まる gcc は、-O2
インライン宣言されていなくても、本体が使用可能な場合に一部の関数をインライン化します (さらに多くの関数が でインライン化できます-O3
)。そのため、実行時間に違いがあり、場合によってはそれらに気付く機会さえあります。の場合はなおさらで-fwhole-program
、外部関数のアウトオブライン バージョンを気にしないことを GCC に伝えますmain()
(GCC は、すべての外部関数が静的になったかのように動作します)。
全体的なコンパイル時間は、増加する場合があります (分析するものが増え、すべてのオプティマイザー アルゴリズムが線形であるとは限らないため) または減少する場合があります (同じヘッダーを複数回解析する必要がない場合)。バイナリ サイズは、増加する (インライン化により、実行速度が向上する代わりに) か、減少する可能性があります (可能性は低いですが、インライン化によって呼び出し元のコードが単純化され、コード サイズが減少する場合があります)。
開発と保守を容易にするために、sqlite のアプローチを使用できます。複数のソース ファイルがありますが、コンパイル前に 1 つにまとめられます (「融合」)。
一部のテストでは、コンパイルとリンクに時間がかかります。少なくとも私はそうしましたが、別のバイナリを受け取りますが、私のものは他のバイナリの 1 バイト以内でした。
オールインワン ファイルは で実行され.000764 MS
、複数ファイル バージョンは で実行されました。.000769 MS
私は約 5 分でそれをまとめましたが、それは小さなプログラムでした。
したがって、全体的に違いはありません。