-2

約 50,000 の異なる.cppファイルがあるとします。

.cppファイルには、約 1000 行のコードを含むクラスが 1 つだけ含まれています (コード自体は複雑ではありません。行列とベクトルに対するメモリ内操作が含まれます。つまり、特別なライブラリは使用されません)。

これらの 50,000 の異なるファイルLinuxをすべてインポートして使用する必要があるプロジェクトを (環境内で) 構築する必要があります。.cpp

いくつかの質問が思い浮かびます。

  1. これをコンパイルするのにおよそどのくらいかかりますか? 約はどうなりますか?コンパイルされたファイルのサイズ?
  2. .so50,000 の異なるファイル (コンパイルされた拡張機能) を保持し、メイン プログラムにそれらを 1 つずつインポートするか、またはこれらの 50,000 の異なる.cppファイルを1 つの大きな .cpp ファイルに結合し、それを処理するより良いアプローチは何でしょうか? どちらの方法がより高速/効率的ですか?

どんな洞察も大歓迎です。

4

4 に答える 4

2

答えはありません、アドバイスだけです。

すぐにあなたに戻ります:あなたは本当に何をしようとしていますか?異なるソース ファイルからコード ライブラリを作成しようとしていますか? それとも実行可能ファイルですか?そんなに多くの .cpp ファイルを実際にコーディングしましたか?

50,000 個のソース ファイルは、かなりの規模のプロジェクトです。すべてのファイルに共通することをしようとしていますか (たとえば、すべてのソース ファイルはリソース、レコード、画像、または何か固有のものを表します)。それとも、50K の異なるコード ファイルだけですか?

コンパイル時間のほとんどは、各ソース ファイルのサイズに基づいていません。これは、各 cpp ファイルと共に取り込まれるヘッダー ファイル (およびそれらに含まれるヘッダー) の量に基づいています。ヘッダーは、通常は実装を含まず、宣言のみを含みますが、コンパイル プロセスを経る必要があります。また、コード ベース全体に冗長なヘッダーがあると、ビルド時間が遅くなる可能性があります。

このような規模の大規模プロジェクトでは、プリコンパイル済みヘッダーが使用されます。一般的に使用されるすべてのヘッダー ファイルを 1 つのヘッダー ファイル (common.h) に含めて、common.h をビルドできます。次に、他のすべてのソース ファイルに "common.h" だけが含まれます。コンパイラは、各ソースの #include "common.h" を認識したときに、コンパイルされたヘッダー ファイルを自動的に使用するように構成できます。

于 2012-05-03T23:09:13.683 に答える
0

'.cpp' から各オブジェクト ファイルを構築し、'.h' ファイルに多くの (そして私はたくさんのことを意味します) 前方宣言を含めることができます。そのため、.hファイルを変更するときに、残りのプログラムを再コンパイルする必要はありません。通常、関数/メソッドは、そのパラメーターにオブジェクトの名前またはそれが返すものを必要とします。他の詳細が必要な場合 - はい、含める必要があります。

スコット・マイヤーズの本を手に入れてください - とても役に立ちます。

ああ - 大きなケーキを食べようとしたとき - 分けました。スライスはより管理しやすくなっています。

于 2012-05-03T22:55:05.013 に答える
0

(i) これを決定する要因が多すぎて、概算すら不可能です。コンパイルは、メモリ、CPU、またはハード ドライブにバインドできます。ファイルの複雑さが重要です(あなたの説明から、あなたの複雑さは低いです)。

(ii)これを行う典型的な方法は、ライブラリを作成し、システムにリンクまたはロードを理解させることです。静的リンクまたは動的リンクを選択できます。

静的リンク
gcc を使用していると仮定すると、これは次のようになります。
g++ -c file1.cpp -o file1.o
g++ -c file2.cpp -o file2.o
...
g++ -c filen.cpp -o filen.o
ar -rc libvector.a file1.o file2.o ... filen.o

次に、独自のコードを作成すると、最終的なリンクは次のようになります。
g++ myfile.cpp libvector.a -o mytask

動的リンク
繰り返しますが、gcc を使用していると仮定すると、これは次のようになります。
g++ -c file1.cpp -fPIC -o file1.o
g++ -c file2.cpp -fPIC -o file2.o
...
g++ -c filen.cpp -fPIC -o filen.o
ld -G file1.o file2.o ... filen.o -o libvector.so

次に、独自のコードをビルドすると、最終的なリンクは次のよう
g++ myfile.cpp libvector.so -o mytask
になります。実行可能ファイルが機能するには、ローダーのパスに libvector.so が必要です。

いずれにせよ、50,000 個のファイルが変更されない限り、最後のコマンドを実行するだけで済みます (はるかに高速になります)。

于 2012-05-03T23:09:36.517 に答える
0

コンパイルにかかる時間は正確にはわかりませんが、各.cpp/.hペアを.oファイルにコンパイルする必要があります。

$ g++ -c -o test.o test.cpp ...

これらがすべて揃ったら、メイン プログラムを次のようにコンパイルします。

$ g++ -c -o main.o main.cpp
$ g++ -o main main.o test.o blah.o otherThings.o foo.o bar.o baz.o etc...

sを使用するというあなたの考えは、.so「プログラムと、場合によっては OS をどれだけ速くクラッシュさせることができるか?」ということです。.so共有ライブラリは、バイナリにリンクされた50,000 s ではなく、少数の大規模なライブラリに対応しています (特に、それらを動的にロードする場合...これはBADになります)。

于 2012-05-03T23:31:51.687 に答える