2017-07-10 2 views
0

質問がばかだと私はすみませますが、私は周りでグーグルでこれについて何も見つかりませんでした。すべてのコードがコンパイルされ、最終バイナリに含まれていますか?

何百ものメソッドを持つクラス拡張を作成し、そのクラスをプロジェクトに含めるとします。その拡張から、私はちょうど2つまたは3つのメソッドを使用すると仮定します。クラス拡張には数百のメソッドがあることに注意してください。

コードをコンパイルすると、バイナリには何が含まれますか?クラスエクステンションから使用したメソッドだけでなく、その特定のプロジェクトで使用されていないメソッドさえも使用しましたか?

+0

静的リンクと動的リンクのどちらを使用するかによって異なります。ダイナミックリンクでは、使用されたシンボル名のみが含まれます。静的リンクでは、 '--no-whole-archive'のようなオプションを使うと、' .o'ファイルだけがインクルードされます。それ以外の場合、 '.a'ファイル全体がインクルードされます。また、直接使用/オーバーライドするメソッドが呼び出されるだけでなく、これはまたvtablesやものについてです。ありがとう。 –

+0

ありがとう。これを答えてください、私は受け入れることができます。 – Phox

答えて

0

これは三つのカテゴリーに分けることができるのGNU LDにおける--whole-archive

  • 静的リンク、--no-whole-archive
  • GNUのLDにおいて、

    • 動的(共有)
    • 静的リンクを連結(他のリンカーにも同様のオプションがあります)。

      コードをリンク

      ダイナミックにのみ、あなたが拡張しているライブラリからのメソッドの名前が含まれます。

      静的リンク、アーカイブ全体

      おっと...他のクラスの全コードが含まれます。

      静的リンク、ノーアーカイブ全体

      のみ使用するオブジェクト・ファイルが含まれます。私は、大規模なクラスでは、可能な限りソースコードを分割することをお勧めします。あなたが明示的に使用するメソッドにもかかわらず

      使用される方法

      、各拡張/オーバーライドはvtableのようないくつかのシンボルが必要になります。コンパイラーの資料を参照してください。

    +0

    これを受け入れることを遅らせて申し訳ありません。答えを感謝します。 – Phox

    関連する問題