Могу ли я еще больше сократить использование памяти «частными байтами» этого крошечного проекта MSVC ++? - PullRequest
5 голосов
/ 13 января 2012

Я спрашиваю об этом из любопытства, а не из-за реальной необходимости, но можно ли еще уменьшить использование памяти этой крошечной программой MSVC ++? Исходный файл в BitBucket.

Программа была скомпилирована с «оптимизация под размер кода».Он создает окно только для сообщений и устанавливает перехват клавиатуры, показывая значок в области уведомлений в ответ на нажатия клавиш Caps / Num / Scroll Lock.

Согласно VMMap, частные байты распределяются следующим образом:

260 KB: Image
252 KB: Heap
240 KB: Page Table
 24 KB: Stack
 24 KB: Private Data
------
800 KB  TOTAL

Изображение

Само приложение использует только 20 КБ;остальное потребляется дюжиной библиотек DLL.Похоже, что это так мало, как он получает.

Heap

Программа выделяет только около 3 КБ данных в куче: ровно три экземпляра определенного класса.Остальное должно быть из CRT и / или стандартного кода ОС.

Может быть, это можно уменьшить?Это выглядит как главный кандидат на экономию.

Страница таблицы

Общий виртуальный размер этой программы составляет 44 МБ, что составляет около 11 тыс. Страниц.Это в среднем 22 байта на страницу (хотя, по-видимому, куча записей не используется).Так что это, вероятно, не может быть уменьшено дальше.Или может это?

Стек и личные данные

Ну, они уже безумно малы ... хотя я удивляюсь, почему они даже не меньше.Я думаю, что в программе нет такого большого количества личных данных или стека.

Можете ли вы предложить способы сделать любой из этих разделов меньшим, чем он есть?


Дополнительные выводы:

  • пустая программа без CRT использует около 204 КБ
  • вызов CreateWindow добавляет 420 КБ
  • вызов для установки перехвата клавиатуры добавляет 156 КБ
  • , избегая использования CRT, экономит 20 КБ
  • , общий виртуальный размер увеличивается аналогичным образом
  • , не используя CRT, значительно экономит размер EXE: с 54 КБ и нижедо 18 КБ, 12 из которых являются ресурсами.

Таким образом, похоже, что большая часть этой памяти используется Windows API, что, по-видимому, исключает значительные дальнейшие сокращения, если только не удастся найти способ сделатьзначки крюка / трея работают без создания окна (эта программа все равно уже игнорирует все сообщения).

Ответы [ 4 ]

3 голосов
/ 14 января 2012

Можно полностью опустить библиотеку времени выполнения C, полагаясь на API, предоставляемые ОС (которые находятся в DLL, которые вы уже отображаете в своем процессе), или реализуя их самостоятельно.

Как правило, оно того не стоит, если только вы уже не используете минимальную библиотеку времени выполнения языка. Это также делает ваше приложение еще менее переносимым.

2 голосов
/ 14 января 2012

«Блок среды процесса» содержит копию всех переменных среды.

Если вы не наследуете какую-либо среду (то есть родительский процесс породил у вас чистую среду), это может привести к заметному снижениюотносительно общего объема используемой памяти.

0 голосов
/ 14 января 2012

С этот ответ , частные байты - это мера памяти, явно зафиксированная или помеченная как MEM_PRIVATE или исполняемые страницы, на которые были записаны.Таким образом, если вы динамически распределяете хранилище вместо использования глобальных переменных (включая локальные статические функции), вы сможете сократить использование личных байтов, хотя вы можете увеличить общее использование кучи.

0 голосов
/ 13 января 2012

Вы можете использовать «pragma pack (1)», чтобы гарантировать, что между областью памяти членов не будет выделено никакого дополнительного пространства.

http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...