6

std :: stringには、文字列オブジェクトで呼び出すことができる30を超えるメンバー関数があります。
それらのいくつかだけを使用した場合はどうなりますか?

未使用のメンバー関数は、実行可能コードセクションのスペースを占有しないと思います。リンカが未使用のメンバー関数を判別し、コンパイルされたバイナリの一部から削除して、どの関数を破棄したかを報告
できるかどうかを知りたいです。 これを行う方法はありますか?gccのリンカーフラグを見ていましたが、関連するものが見つかりませんでした。

4

3 に答える 3

4

std::stringはテンプレートクラス(tostd::stringのみ)であるため、使用されたメソッドのみがインスタンス化され、未使用のメソッドがコンパイルされることはなく、実行可能ファイルから削除することはできません。typedefstd::basic_string<char>

非テンプレートクラスについて:virtualvtableにはアドレスが必要なため、関数は、呼び出されたかどうかに関係なく、常に実行可能ファイルに格納されます。実行可能ライブラリまたは静的にリンクされたライブラリのソースからのその他のメソッド(および無料の関数)は、実際に使用されている場合にのみバイナリにリンクされます。しかし、にリンクされていない関数を出力するためのリンカーフラグがないことを私は知っています。

一方、共有ライブラリ(.so)には、すべての(エクスポートされた)関数とメソッドを含める必要があります。これは、この共有ライブラリを使用するバイナリが任意の(エクスポートされた)関数を使用できるためです。ただし、共有ライブラリは、メモリに1回だけロードされている間、多くの実行可能ファイルで使用できるため、通常、これは価値があります。

于 2012-05-28T18:12:27.573 に答える
0

この答えはあなたのケースを正確にカバーしていませんが、あなたのクラスの呼び出されていない関数があるかどうかを知りたい場合は、cppcheckのようないくつかの静的分析ツールがこれを報告します。

于 2012-05-28T18:20:51.037 に答える
0

標準ライブラリは通常共有されているため、実行可能ファイルにスペースを取りません。

静的にリンクする場合、リンカーに関する限り、非仮想メンバー関数は、おかしな名前の通常の庭のさまざまな関数にすぎません。リンカが通常の機能で実行できることは何でも、非仮想メンバーで実行できます。GNU LDは、特定のアーキテクチャでは未使用の関数を削除できる可能性がありますが、他のアーキテクチャでは削除できない可能性があります。

もちろん、のメンバーなどの関数テンプレートはstd::stringまったく別の話です。リンカにとって、それらはライブラリからではなく、オブジェクト(およびインスタンス化したオブジェクトのみ)から取得されます。

于 2012-05-28T18:16:31.193 に答える