Включив iostream
в ваш исходный файл, компилятор должен сгенерировать код для настройки и демонтировать стандартную библиотеку ввода-вывода C ++. Вы можете увидеть это, посмотрев на вывод из 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 ++, "искаженные" компилятором, и выдает более значимые имена. Первый столбец - это адрес, если функция включена в исполняемый файл. Второй столбец - тип. "T "- это код в сегменте" текст "." 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
.
Когда ваш исходный файл содержит только stdio.h
, сгенерированный двоичный файл аналогичен тесту без iostream
, поскольку стандартная библиотека ввода / вывода C не требует какой-либо дополнительной инициализации сверх того, что уже происходит в C динамическая библиотека. Вы можете увидеть это, посмотрев на вывод nm
, который идентичен.
В общем, попытка интуитивно понять информацию об объеме кода, сгенерированного конкретным исходным файлом на основе размера исполняемого файла, не будет иметь смысла; слишком многое может измениться, и простые вещи, такие как расположение исходного файла, могут изменить двоичный файл, если компилятор содержит отладочную информацию.
Вы также можете найти objdump
полезным для просмотра содержимого ваших исполняемых файлов.