![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
neokoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 14.4.2010 Репутация: нет Всего: -3 |
Есть простое WinAPI-приложение, создающее всего одно окно :
Скомпилировав в VC++ 2008 И запустив обнаружил, что памяти потребляет 27Мб виртуальной и более 3МБ физической. Почему так много и есть ли способы уменьшить занимаемую приложением память. Я ведь фактически создал всего лишь одно окно и всё. Неужели для этого необходимо 3Мб физ. памяти? Вот список DLL для процесса: ![]() Я не в курсе считаются ли хуковые dll в общей памяти занимаемой процессом, но как видно из списка там только хук от Outpostа все остальные библиотеки системные вроде. В общем зачем так много всего грузится для простейшей программы не пойму. И можно как-то уменьшить объём расходуемой памяти для такого приложения на чистом API? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Все необходимые библиотеки проецируются в память твоего процесса. Из системных это как минимум кернел, гуи и юзер. Без C runtime тоже не особо обойдешься. Часть библиотек, которые реально не нужны, можно не подключать - покопайся в ключах компилятора. Но, честно, сказать, смысла в этом мало: "лишнюю" память ты не получишь, только лишний геморрой выяснять, что тебе реально нужно из системных функций. Или что понадобится чуть позже. Разве что речь идет о мобильных системах; как обстоит дело там - не знаю.
-------------------- ... |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а чем этот листинг снят и в какой момент? если это список статически подгружаемых модулей, то это ненормально, если это список модулей, подгружаемых в ран-тайме, то можно сказать, что это еще не так много, т.к. все модули, зависящие от подключаемого статикой тут будут так же видны, т.е. в таком случае раскрывается вся иерархия зависимостей проекта, что вообще-то и обуславливает суть динамических библиотек, ничего здесь страшного нет -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
neokoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 14.4.2010 Репутация: нет Всего: -3 |
Process Explorer, после запуска программы. Объясните, пожалуйста, чем отличаются статически подгружаемые модули, от модулей, подгружаемых в ран-тайме? |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
в ран-тайме, т.е. динамически - это с помощью функции LoadLibrary
+ следует учесть, что модули сами могут статически подключать другие модули Добавлено через 7 минут и 38 секунд это как раз второй вариант, а первый может дать например PE Explorer, на вкладке Import, там будет список модулей, при отсутствии которых, приложение заведомо не будет запущено, т.е. это непосредственные статические зависимости, их будет скорее всего не много, их и можно/нужно контролировать при сборке проекта -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
neokoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 14.4.2010 Репутация: нет Всего: -3 |
Это понятно. Не пойму всё же что вы имеете ввиду под "статически подгружаемые модули"? Любая библиотека подключается к процессу с помощью LoadLibrary. Только это можно делать явно(динамически) или это делается системой неявно, когда вы используете в проекте библиотеку импорта, вместо статической библиотеки. Как вы можете видеть в моём примере все библиотеки, которые подгружаются, подгружаются системой автоматически. Я никакую библиотеку не вызываю явно. |
|||
|
||||
Abyx |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 601 Регистрация: 3.11.2009 Репутация: 2 Всего: 10 |
||||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
статически, т.е. жестко, при сборке программы, в PE, в секции импорта в основном - как раз из-за особенностей и количества ПО, установленного на нее -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
neokoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 14.4.2010 Репутация: нет Всего: -3 |
||||
|
||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Посмотрите ваше приложение в Dependency Walker (Depends.Exe из общих тулзов в VS или PSDK). Там сразу будет видно, какая dll требуется непосредственно вашему приложению, а что попадает уже из ее требований.
|
|||
|
||||
volatile |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2107 Регистрация: 7.1.2011 Репутация: 13 Всего: 85 |
||||
|
||||
neokoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 14.4.2010 Репутация: нет Всего: -3 |
Я посмотрел. Тут такое дело, что без kernel32.dll, user32.dll, gdi32.dll(для окон) видимо не обойтись, а они уже подгружают другие библиотеки, которые им необходимы. Я тут обнаружил интересную директиву #define WIN32_LEAN_AND_MEAN. Она позволяет иногда уменьшить размер расходуемой памяти, за счёт исключения редко используемых компонент во включаемых заголовочных файлах windows. |
|||
|
||||
neokoder |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 14.4.2010 Репутация: нет Всего: -3 |
Тоже читал о такой возможности, но без знания деталей того как функционирует менеджер памяти windows и того как происходит линковка(на уровне ассемблера и формата Exe-файла), такое экспериментаторство может привести к печальным последствиям для программы. Я этих основ, к сожалению, пока не знаю. Это сообщение отредактировал(а) neokoder - 6.3.2011, 16:55 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |