ソース ファイルにインクルードすることによりiostream、コンパイラは C++ 標準 I/O ライブラリをセットアップおよび破棄するコードを生成する必要があります。nmこれは、オブジェクト ファイルのシンボル (通常は関数) を示すからの出力を見るとわかります。
$ nm --demangle test_with_iostream
08049914 d _DYNAMIC
08049a00 d _GLOBAL_OFFSET_TABLE_
08048718 t global constructors keyed to main
0804883c R _IO_stdin_used
w _Jv_RegisterClasses
080486d8 t __static_initialization_and_destruction_0(int, int)
08048748 W MyClass::MyClass()
U std::string::size() const@@GLIBCXX_3.4
U std::string::operator[](unsigned int) const@@GLIBCXX_3.4
U std::ios_base::Init::Init()@@GLIBCXX_3.4
U std::ios_base::Init::~Init()@@GLIBCXX_3.4
080485cc t std::__verify_grouping(char const*, unsigned int, std::string const&)
0804874e W unsigned int const& std::min<unsigned int>(unsigned int const&, unsigned int const&)
08049a3c b std::__ioinit
08049904 d __CTOR_END__
... (remaining output snipped) ...
(--demangleコンパイラによって「マングル」された C++ 関数名を取り、より意味のある名前を生成します。関数が実行可能ファイルに含まれている場合、最初の列はアドレスです。2 番目の列は型です。「t」は " text" セグメント。"U" は、他の場所 (この場合は C++ 共有ライブラリから) からリンクされたシンボルです。)
を含めずにソース ファイルから生成された関数と比較してくださいiostream。
$ nm --demangle test_without_iostream
08049508 d _DYNAMIC
080495f4 d _GLOBAL_OFFSET_TABLE_
080484ec R _IO_stdin_used
w _Jv_RegisterClasses
0804841c W MyClass::MyClass()
080494f8 d __CTOR_END__
... (remaining output snipped) ...
ソース ファイルに が含まれているiostream場合、コンパイラは、iostream.
ソース ファイルに のみが含まれている場合、C 標準 I/O ライブラリは、C 動的ライブラリで既に行われている以上の追加の初期化を必要としないためstdio.h、生成されたバイナリは を使用しないテストに似ています。これは、同じ出力iostreamを見るとわかります。nm
ただし、一般に、実行可能ファイルのサイズに基づいて、特定のソース ファイルによって生成されるコードの量に関する情報を直感的に把握しようとしても意味がありません。変更される可能性のあるものが多すぎます。コンパイラにデバッグ情報が含まれている場合、ソース ファイルの場所などの単純なことがバイナリを変更する可能性があります。
実行可能ファイルの内容をいじるのにもobjdump役立つ場合があります。