バイナリで使用されていないものを含めたりリンクしたりすると、どのような悪影響がありますか?

StackOverflow https://stackoverflow.com/questions/751966

  •  09-09-2019
  •  | 
  •  

質問

ビルド中のバイナリがあり、実際には使用されない多数のファイルをインクルードし、それらのインクルード ファイルによって記述されたライブラリへの後続のリンクを行うとします。(繰り返しますが、これらのライブラリは決して使用されません)

これにより、コンパイル時間の増加以外にどのような悪影響が生じるのでしょうか?

役に立ちましたか?

解決

私は考えることができるいくつかのの名前空間の汚染バイナリサイズ

あります

他のヒント

の時間をコンパイルすることに加えて、増加した複雑さ、デバッグ中に不伸延、メンテナンスオーバーヘッド。

それとは別に、何もない。

サーシャがリストしたものに加えて、 メンテナンス費用. 。未使用のものを削除することを選択した場合、将来、何が使用され、何が使用されないかを簡単に検出できますか?

ライブラリが使用されることはありません場合は、

は、実行可能ファイルのサイズの増加があってはならない。

正確なリンカによっては、また、あなたの未使用のライブラリのグローバルオブジェクトがまだ構築され得ることに気づくかもしれません。これは、メモリのオーバーヘッドを意味し、起動コストが増大ます。

あなたは含めてではなく、使用しているライブラリは、ターゲットシステム上にない場合は、

、彼らが必要でない場合であっても、コンパイルすることができません。

ここにCおよび静的ライブラリに関する同様の質問に対する私の答えです。おそらく、それは同様にC ++の文脈であなたに便利です。

あなたは、コンパイル時間の増加に言及します。それから、私は動的ライブラリを静的にリンクされている理解し、そしてません。この場合、リンカは、未使用の機能をどのように処理するかによって決まります。それはそれらを無視した場合、あなたは、ほとんどメンテナンスの問題を持っています。彼らは含まれます場合は、実行ファイルサイズが大きくなります。さて、これは、ハードドライブを取る場所よりも重要です。大規模な実行ファイルはキャッシュの問題に遅くなるため、実行することができます。アクティブコードと非アクティブコードをexeファイルに隣接している場合、それらは効果的に小さく、あまり効率的なキャッシュを作り、一緒にキャッシュされます。

VC2005と上記は、多くの場合、使用されるコードの効果的なキャッシングを確実な方法で実行中のコードを注文PGOと呼ばれる最適化を有します。グラムの++は、同様の最適化を持っている場合、私は知りませんが、それはそれに探して価値がある。

ここに問題を少しまとめました。必要に応じて wiki 編集してください。

主な問題は次のとおりです。 名前空間の汚染これにより、将来のデバッグ、バージョン管理に問題が発生し、将来のメンテナンスコストが増加する可能性があります。

少なくとも、軽微な問題も発生します。 バイナリの膨張, 、関数/クラス/名前空間の参照は維持されるため(シンボルテーブル内?)。動的ライブラリはバイナリ サイズを大幅に増やすべきではありません (ただし、バイナリの実行には依存関係が必要になります)。GNU C コンパイラから判断すると、静的にリンクされたライブラリは、ソース内で参照されない限り、最終バイナリに含めるべきではありません。(C コンパイラに基づいた仮定なので、明確化/修正が必要な場合があります)

また、ライブラリの性質によっては、グローバルおよび静的なオブジェクト/変数がインスタンス化される場合があり、 起動時間とメモリオーバーヘッドの増加.

ああ、コンパイル/リンク時間も増加しました。

私は、私が働いているいくつかのシンボルが(ソース・ファイルに表示されますので、私は、ソースツリー内のファイルを編集するとき、それはイライラ見つける例えば、私はちょうどプロトタイプを変更した関数名、 - 、悲しいことが、より多くまたは一般的に、ちょうどので、私は使用が正しいことを確認する必要がある、またはコンパイラは、そのファイルでの使用が間違っていると言われます)ヘッダにプロトタイプを追加しました。だから、私は、ファイルを編集します。このファイルには、何をやっている - そして、私はこの問題を参照してください?そして、それはコードが製品に「使用」されているが、それは本当に積極的に全く使用されていないことが判明します。

私は月曜日に、この問題の発生を発見しました。コードの10,000行を持つファイルは、「のexternボイドadd_remainder(ボイド);」関数を呼び出しだから、0の引数で、私はそれを修正するために行ってきました。そして、私はそれはそれは削除されていなかった約15年前から開発スタブであったが...コードの残りの部分を見ました。きれいにコードを切除すると、半分以上-ダースファイルにマイナーな編集を伴うことが判明 - と私はまだケースで列挙の途中から列挙定数を削除しても安全であるかどうかを働いていませんでした。一時的に、それがマークされている。「未使用の/廃止は - ?それは安全に取り外すことができる」

コードのその塊は、過去15年間、ゼロ入り江のカバレッジを持っていた - 、それは広大なシステムのほんの一部の生産、テスト、...本当だ - パーセント単位で、それは上の1%のブリップ未満ですチャート。それでも、それは余分なコードを浪費されます。

不可解。迷惑な。情けない共通(私は今年これまで記録され、固定、少なくとも半ダース同様のバグました)。

そして、私の時間の無駄 - と他の開発者の時間。ファイルには、私がやっていた何をして他の人々によって長年にわたって定期的に編集されていた - 。徹底した仕事を

私はごく小さな部分が使用されるのの.libファイルをリンクですべての問題を経験したことがありません。実際に使用されているだけのコードが実行可能ファイルにリンクされ、リンク時間が(Visual Studioに)著しく増加しなかった。

あなたはバイナリにリンクし、それらが実行時にロードされる場合は、

、彼らはそうしない方法で、あなたのモジュールの状態を変更する希少な資源を消費するために少量のメモリを割り当てるから何かを行うことができます非自明な初期化を行うことができます期待して、以降ます。

あなたは未知数の束を排除するだけで、必要のないものを取り除く方がいいでしょう。

これはおそらくビルドツリーがよく維持されていない場合は、コンパイルに失敗することがありました。 your'eは、スワップスペースなしで組み込みシステムの上でコンパイルする場合。大規模なオブジェクトファイルをコンパイルしようとしているときに、コンパイラがメモリ不足ことができます。

これは、最近、私たちに仕事で起こっています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top