Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Как уменьшить размер опер. памяти занимаемой проц |
Автор: neokoder 2.3.2011, 13:21 | ||
Есть простое WinAPI-приложение, создающее всего одно окно :
Скомпилировав в VC++ 2008 И запустив обнаружил, что памяти потребляет 27Мб виртуальной и более 3МБ физической. Почему так много и есть ли способы уменьшить занимаемую приложением память. Я ведь фактически создал всего лишь одно окно и всё. Неужели для этого необходимо 3Мб физ. памяти? Вот список DLL для процесса: http://s2.ipicture.ru/uploads/20110302/GoWfFmOa.png Я не в курсе считаются ли хуковые dll в общей памяти занимаемой процессом, но как видно из списка там только хук от Outpostа все остальные библиотеки системные вроде. В общем зачем так много всего грузится для простейшей программы не пойму. И можно как-то уменьшить объём расходуемой памяти для такого приложения на чистом API? |
Автор: Earnest 2.3.2011, 14:43 |
Все необходимые библиотеки проецируются в память твоего процесса. Из системных это как минимум кернел, гуи и юзер. Без C runtime тоже не особо обойдешься. Часть библиотек, которые реально не нужны, можно не подключать - покопайся в ключах компилятора. Но, честно, сказать, смысла в этом мало: "лишнюю" память ты не получишь, только лишний геморрой выяснять, что тебе реально нужно из системных функций. Или что понадобится чуть позже. Разве что речь идет о мобильных системах; как обстоит дело там - не знаю. |
Автор: GremlinProg 3.3.2011, 09:37 |
а чем этот листинг снят и в какой момент? если это список статически подгружаемых модулей, то это ненормально, если это список модулей, подгружаемых в ран-тайме, то можно сказать, что это еще не так много, т.к. все модули, зависящие от подключаемого статикой тут будут так же видны, т.е. в таком случае раскрывается вся иерархия зависимостей проекта, что вообще-то и обуславливает суть динамических библиотек, ничего здесь страшного нет |
Автор: GremlinProg 3.3.2011, 13:14 |
в ран-тайме, т.е. динамически - это с помощью функции LoadLibrary + следует учесть, что модули сами могут статически подключать другие модули Добавлено через 7 минут и 38 секунд это как раз второй вариант, а первый может дать например PE Explorer, на вкладке Import, там будет список модулей, при отсутствии которых, приложение заведомо не будет запущено, т.е. это непосредственные статические зависимости, их будет скорее всего не много, их и можно/нужно контролировать при сборке проекта |
Автор: neokoder 3.3.2011, 15:26 | ||||
Это понятно.
Не пойму всё же что вы имеете ввиду под "статически подгружаемые модули"? Любая библиотека подключается к процессу с помощью LoadLibrary. Только это можно делать явно(динамически) или это делается системой неявно, когда вы используете в проекте библиотеку импорта, вместо статической библиотеки. Как вы можете видеть в моём примере все библиотеки, которые подгружаются, подгружаются системой автоматически. Я никакую библиотеку не вызываю явно. |
Автор: Abyx 3.3.2011, 15:50 | ||
никак не уменьшить. такой расход памяти не из за особенностей приложения, а из за ОС |
Автор: GremlinProg 4.3.2011, 11:32 | ||
статически, т.е. жестко, при сборке программы, в PE, в http://www.google.com/search?q=PE+%D1%81%D0%B5%D0%BA%D1%86%D0%B8%D1%8F+%D0%B8%D0%BC%D0%BF%D0%BE%D1%80%D1%82%D0%B0 в основном - как раз из-за особенностей и количества ПО, установленного на нее |
Автор: neokoder 4.3.2011, 23:06 | ||
Ну это и есть тоже самое что и я говорю - использование библиотеки импорта вместо статической библиотеки. |
Автор: xvr 5.3.2011, 08:25 |
Посмотрите ваше приложение в Dependency Walker (Depends.Exe из общих тулзов в VS или PSDK). Там сразу будет видно, какая dll требуется непосредственно вашему приложению, а что попадает уже из ее требований. |
Автор: volatile 5.3.2011, 23:08 | ||
посмотрите в сторону функции SetProcessWorkingSetSize(,,,); Кроме-того можно еще уменьшить размер стека, в свойствах проекта. |
Автор: neokoder 6.3.2011, 16:28 | ||
Я посмотрел. Тут такое дело, что без kernel32.dll, user32.dll, gdi32.dll(для окон) видимо не обойтись, а они уже подгружают другие библиотеки, которые им необходимы. Я тут обнаружил интересную директиву #define WIN32_LEAN_AND_MEAN. Она позволяет иногда уменьшить размер расходуемой памяти, за счёт исключения редко используемых компонент во включаемых заголовочных файлах windows. |
Автор: neokoder 6.3.2011, 16:50 | ||
Тоже читал о такой возможности, но без знания деталей того как функционирует менеджер памяти windows и того как происходит линковка(на уровне ассемблера и формата Exe-файла), такое экспериментаторство может привести к печальным последствиям для программы. Я этих основ, к сожалению, пока не знаю. |