2009-04-22 9 views
9

これは本当にばかげた質問のように思えるかもしれませんが、実際にはObjective-Cのヘッダーファイル(実際には#importと呼んでいます)を入れるコストはいくらですか?私は常にさまざまな場所に同じヘッダーを含めることに疲れているので、私は単純にGlobalReferences.hというファイルを作成し、いくつかのよく参照されるヘッダーを含むことにしました。Objective-Cのヘッダーファイルを含むコスト

他のファイルが使用されていない場合は、他のファイルへの参照を含めるには相当な費用がかかりますか?リンカはただ#importを使用しているときにリンカが他のファイルを認識したように思えるので私の腸は私に「いいえ」と言いますが、私のプロジェクトが懸念しているのはiPhoneの開発に特別な考慮が必要かどうかはわかりませんでした。何かご意見は?

答えて

7

リンカーは#import edファイルについて何も知らない。実際、Objective-Cコンパイラはそれらについて何も知らず、プリプロセッサによって前処理されています。プリプロセッサは、ヘッダーの内容をソースファイルにインクルードしたポイントに効果的に挿入します。実際のObjective-Cコンパイラは、使用されていなくても、追加の関数プロトタイプとクラスインタフェース定義を処理する必要があります。これは通常は長時間の作業ではありませんが、コンパイル時間を長くする可能性があります。その結果、アプリケーションのサイズとパフォーマンスは影響を受けません。

は、生のソースコードは(すべてのヘッダファイルと展開されたマクロなどを含む)をどのように見えるかを確認するには、次の

gcc -E your-source-file.m 
+0

これをクリアしていただきありがとうございます。 – LucasTizma

2

最大の欠点は、コンパイル時間になります。すべてのヘッダーがすべてのソースファイルにインポートされている場合、プロジェクト全体のは、ヘッダーファイルを変更するたびに再構築する必要があります。

3

必要以上のヘッダーファイルをインポート/含めるとコンパイル時間が長くなります。この痛みの一部をpre-compiled headersで緩和することができます。

0

は先に行くとそれを行います。あなたが含んでいるヘッダーが大量で、あらかじめコンパイルされたヘッダーを使用していない限り、違いはありません。他の人が言ったように、#importはプリプロセッサディレクティブです。これには実行時の結果はなく、多くの場合、コンパイル時に大きな影響はありません。

+0

この問題に関するご説明いただきありがとうございます。 – LucasTizma

1

Objective-Cにヘッダーファイルを(実際には#importを呼び出す)費用はいくらですか?

これらのファイルを不必要に読み込むためにコンパイラが使い果たされることがあります。 #importが編集されると、追加のファイルを各翻訳(たとえば.mファイル)ごとに解析、コンパイルなどして表示する必要があります。これにより、ビルドとリンク時間が大幅に長くなります。 10倍長くなるのはではなく、である。

さまざまな場所に常に同じヘッダーを含めることに飽きてしまったので、いくつかのよく参照されるヘッダーを含むGlobalReferences.hファイルを作成することにしました。

通常、これは非常に悪いアプローチです。一般的な問題は、GlobalReferences.hに含まれるファイルが変更されたときは、プロジェクト全体と依存関係を再構築、再リンクなどする必要があることです。

このような相互依存性が存在する小さなライブラリやパッケージ(たとえば、StoreKit.frameworkは小さなパッケージ/ライブラリ)に分割するのが望ましいですが、ヘッダーのライブラリ/フレームワーク/パッケージを詰め込むことで何も解決できません。また、前方宣言とクラス継続または@implementationにデータを格納すると、必要な変換のみにライブラリ/ヘッダーを含めることができるため、依存関係を大幅に減らすことができます。

最後に、レイジーインクルード後のクリーンアップは非常に時間がかかります。特にプロジェクトのビルド時間が耐え難いほど遅くなるまで待っています。基本的には、不要な依存関係を取り除き、再構築し、繰り返す必要があります(数日間)。

他のファイルが使用されていない場合は、他のファイルへの参照を含めるとかなりの費用がかかりますか?

絶対に。プロジェクトが大きくなればなるほど、悪い怠惰な包含物になります。大規模なプロジェクトでは、コンパイルされたファイルのほとんどに数十〜数十万行の行が追加され、多くのソースを頻繁に再コンパイルする可能性があります。これはビルドプロセスにかなりの複雑さを追加します.CPUの要求が上がり、RAMの使用率が上がり、ディスクIOが上昇します。また、コードベース/プロジェクトの複雑さが増すにつれて、これが大きな問題になります。

関連する問題