2010-12-15 12 views
4

C++では、使用されない追加のメソッドや関数を定義すると、より大きなメモリフットプリントや実行速度が低下しますか?追加の関数/メソッド定義は、プログラムのメモリフットプリントを増加させますか?

基本的に、クラスにはいくつかのユーティリティデバッギングメソッドがありますが、クラスの通常の使用には何も必要ありません。これらの定義が使用されなくても残っているかどうかにかかわらず、メモリの使用量や速度の点で違いがありますか?例:

class myClass 
{ 
    public: 

     //Something the user of this class would use 
     int doSomething() {...} 

     //Something used solely to make sure I wrote the class properly 
     bool isClassValid() {...} 
}; 

... 

myClass classInstance(); 
myClass.doSomething(); 
+1

どのプラットフォームですか? –

+0

Windowsですが、質問はどのプラットフォームにも当てはまります。 – Lewis

+0

この質問はどのプラットフォームにも当てはまります。答えはプラットフォームによって大きく異なります。組み込みRMXは、メインフレームOSとはメモリ管理の仕方やアプリケーションの仕組みが大きく異なっています。 –

答えて

2

注意を/OPT:REFを渡すことができますメモリ内のすべてのコードを常に保持しません。コードは定数データなので、OSはファイルからオンデマンドで読み込むことができます。スワップから動的データを読み込むようにします。しかし、OSが別の方法ではなくページで読み込むため、使用されないコードがロードされることはありません。言い換えれば、OSとコードセグメントの構造について十分な知識がなければ、実際にコードセグメントのどの部分が実際にメモリに格納されるのかを予測することは非常に難しいです。確かに言えることは、あなたのコードが実際のサイズより少ない物理メモリを消費する可能性が完全にあることだけです。

実行速度は答えがノーだと思います。アプリケーションの読み込み速度は向上する可能性がありますが、コードが実行されると、そのコードの大きさが気になることはなく、速度にはまったく影響しません。つまり、あなたの記憶限界に近づいていないと、OSが大きくスワップし始め、すべてが非常に遅くならない限り。

すでに述べたように、コンパイラはコードを最適化することがあります。しかし、デバッグ方法に#ifdefsを使用することで自分でできることもありますが、通常はそうすることをお勧めします。

+0

実行ファイルが大きすぎると、キャッシュのパフォーマンスにも影響する可能性があります。 –

+0

あなたはそうだ、私はそれについて考えなかった。 –

2

コードを生成するメソッドです。そのコードはどこかに存在します。実行可能ファイルがビルドされると、おそらく実行可能ファイルに存在します。これにより、実行可能ファイルのサイズが大きくなり、ロード時間が長くなり、キャッシュの動作に影響を与える可能性があります。答えは「はい」です。

例外を除いて...それは濁ってしまいます。

良いコンパイラと優れたリンカは、実際に使用していないコードが実行可能ファイルに組み込まれないように相互作用できます。これの細かさはさまざまですが、個々の機能に至るまで(さらには言語によってはさらに低くなる可能性もあります)。コンパイラが問題のメソッドが実際に呼び出されていないことを通知でき、リンカが関数レベルでコードを取り込めるほどスマートであれば、答えは "no"に変わります。

要するに、使用しているツールや実行しているプラ​​ットフォームに関連して調査する必要がある要因のホストによって、答えは「はい」または「いいえ」です。

+0

余分な機能の有無にかかわらず、常に2つの.exeファイルサイズを比較できます。 –

+0

@ muntooしかしSergey Tachenovの答えを参照してください... – btown

2

未使用のメソッドは、リンカーに見つけて削除するよう指示しない限り、一般に実行可能ファイルに存在します。

たとえば、Macでは、-dead_stripldに渡して、このようなデッドコードを取り除くことができます。あなたは、Visual C++を使用してWindowsを使っているのであれば、あなたはほとんどのOSドンという(私はVisual Studioが自動的にリリースでは、このオプションを渡すためにプロジェクトを設定し構築する想像しますが、デバッグビルドではない。)link.exe

0

コードが使用されていないかどうかを判断することはかなり難しい問題です。ちょうどhelloワールドプログラムを作成し、glibcと静的にリンクして、objdumpを使用してバイナリで終わるすべての迷惑メールを調べます。このコードの大部分はで、ではありませんが、コンパイラやリンカーが最適化することが困難または不可能な方法で参照されています。ライブラリの作者がこの種の依存関係を避けるために非常に頑張っていない限り、未使用の関数/メソッドとなります。私はそれがC言語よりもC言語では難しいと思っています。

関連する問題