Представьте, что у вас есть большая и сложная утилита (например, компилятор), и пользователь просит ее о помощи (например, они набирают gcc --help
вместо того, чтобы просить ее скомпилировать что-либо). В таком случае, сколько кода и данных утилиты используется?
Большинство программ имеют различные необязательные части, которые не используются (например, что-то, что работает с графикой, будет иметь некоторый код для 16 бит на пиксель и другой код для 32 бит на пиксель, и будет определять, какой код использовать и не использовать другой код). Большинство распределителей кучи «нетерпеливы» (например, они просят у ОС 20 МБ пространства, а затем могут только «malloc()
2 МБ). Иногда программа отображает в памяти огромный файл, но затем получает доступ только к небольшой части. этого.
Даже для вашего простого примера кода "hello world"; виртуальное адресное пространство, вероятно, содержит огромную (несколько МиБ) разделяемую библиотеку для поддержки множества функций стандартной библиотеки C (например, puts()
, fprintf()
, sprintf()
, ...), и ваша программа использует только небольшую часть этого общая библиотека; и ваша программа, вероятно, резервирует консервативный объем пространства для своего стека (например, может быть, 20 КБ для стека), а затем, вероятно, использует только несколько сотен байтов стека.