Как уменьшить потребление памяти C ++ по умолчанию?

У меня есть серверное приложение, написанное на C ++. После запуска он использует около 480 КБ памяти в x86 Linux (Ubuntu 8.04, GCC 4.2.4). Я считаю, что 480 КБ - это чрезмерный объем памяти: сервер еще даже ничего не делает, к серверу не подключены клиенты. (См. Также мой комментарий ниже, в котором я объясняю, почему я считаю, что 480 КБ - это много памяти.) Единственное, что сервер делает во время инициализации, - это порождает один или два потока, настраивает несколько сокетов и другие простые вещи, которые не требуют больших затрат памяти.

Обратите внимание, что я говорю о real ] использование памяти, а не размер виртуальной машины. Я измерил это, запустив 100 экземпляров моего сервера на простаивающем ноутбуке и измерив использование системной памяти со значением «бесплатно» до и после запуска экземпляров сервера. Я уже учел кеш файловой системы и тому подобное.

После некоторого тестирования выяснилось, что что-то в среде выполнения C ++ заставляет мой сервер использовать такой объем памяти, даже если сам сервер ничего не делает. Например, если я вставлю

getchar(); return 0;

сразу после

int main(int argc, char *argv[]) {

, то использование памяти по-прежнему будет 410 КБ на экземпляр!

Мое приложение зависит только от Curl и Boost. У меня достаточно опыта программирования на C, и я знаю, что библиотеки C не склонны увеличивать потребление памяти, пока я их не использую.

Другие вещи, которые я обнаружил:

  • Простое приложение C hello world потребляет около 50 КБ памяти.
  • Простое приложение C ++ hello world, связанное с Curl, но не использующее Curl, также потребляет около 50 КБ памяти.
  • Простое приложение C ++ hello world (без Boost) потребляет около 100 КБ
  • Простое приложение C ++ hello world, которое включает некоторые заголовки Boost, но фактически не использует Boost, потребляет около 100 КБ памяти. Никаких символов Boost при проверке исполняемого файла с помощью 'nm'.

Таким образом, мой вывод таков:

  1. Gcc выбрасывает неиспользуемые символы Boost.
  2. Если мое приложение использует Boost, тогда что-то в среде выполнения C ++ (возможно, динамический компоновщик) заставляет ее использовать много памяти. Но что? Как мне узнать, что это такое, и что я могу с ними поделать?

Я помню, как несколько лет назад в KDE обсуждались проблемы с динамическим компоновщиком C ++. Тогда динамический компоновщик Linux C ++ приводил к медленному запуску приложений KDE C ++ и большому потреблению памяти. Насколько мне известно, с тех пор эти проблемы были исправлены в среде выполнения C ++. Но может ли что-то подобное быть причиной чрезмерного потребления памяти, которое я наблюдаю?

Мы будем благодарны за ответы экспертов по gcc / динамическому связыванию.

Для тех, кому интересно, рассматриваемый сервер является агентом ведения журнала Phusion Passenger: https://github.com/FooBarWidget/passenger/blob/master/ext/common/LoggingAgent/Main. cpp

15
задан Michael Petrotta 14 November 2010 в 23:02
поделиться