Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как уменьшить размер опер. памяти занимаемой проц, для приложения на чистом API 
:(
    Опции темы
neokoder
Дата 2.3.2011, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 14.4.2010

Репутация: нет
Всего: -3



Есть простое WinAPI-приложение, создающее всего одно окно :
Код

#include <windows.h>

LONG WINAPI WndProc(HWND, UINT, WPARAM,LPARAM);
int  WINAPI  WinMain (HINSTANCE  hInstance,
                     HINSTANCE  hPrevInstance,
                     LPSTR    lpCmdLine,
                      int    nCmdShow)
{
  HWND hwnd;
  MSG msg;
  WNDCLASS w;
  memset(&w,0,sizeof(WNDCLASS));
  w.style = CS_HREDRAW | CS_VREDRAW;
  w.lpfnWndProc = WndProc;
  w.hInstance = hInstance;
  w.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
  w.lpszClassName = L"My Class";
  RegisterClass(&w);
  hwnd = CreateWindow(L"My Class", L"Окно пользователя", WS_OVERLAPPEDWINDOW,500, 300, 500, 380, NULL, NULL, hInstance, NULL);
  ShowWindow(hwnd,nCmdShow);
  UpdateWindow(hwnd);
  while(GetMessage(&msg,NULL,0,0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

LONG WINAPI WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
  switch (Message)
  {
    case WM_DESTROY: PostQuitMessage(0); break;
    default: return DefWindowProc(hwnd, Message, wparam, lparam);
  }
  return 0;
}


Скомпилировав в VC++ 2008 И запустив обнаружил, что памяти потребляет 27Мб виртуальной и более 3МБ физической. Почему так много и есть ли способы уменьшить занимаемую приложением память. Я ведь фактически создал всего лишь одно окно и всё. Неужели для этого необходимо 3Мб физ. памяти? 

Вот список DLL для процесса:
user posted image


Я не в курсе считаются ли хуковые dll в общей памяти занимаемой процессом, но как видно из списка там только хук от Outpostа все остальные библиотеки системные вроде. В общем зачем так много всего грузится для простейшей программы не пойму. И можно как-то уменьшить объём расходуемой памяти для такого приложения на чистом API?
PM MAIL   Вверх
Earnest
Дата 2.3.2011, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Все необходимые библиотеки проецируются в память твоего процесса. Из системных это как минимум кернел,  гуи и юзер. Без C runtime тоже не особо обойдешься. Часть библиотек, которые реально не нужны, можно не подключать - покопайся в ключах компилятора. Но, честно, сказать, смысла в этом мало: "лишнюю" память ты не получишь, только лишний геморрой выяснять, что тебе реально нужно из системных функций. Или что понадобится чуть позже. Разве что речь идет о мобильных системах; как обстоит дело там - не знаю.


--------------------
...
PM   Вверх
GremlinProg
Дата 3.3.2011, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(neokoder @  2.3.2011,  15:21 Найти цитируемый пост)
Вот список DLL для процесса

а чем этот листинг снят и в какой момент?

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

т.е. в таком случае раскрывается вся иерархия зависимостей проекта,
что вообще-то и обуславливает суть динамических библиотек,
ничего здесь страшного нет


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
neokoder
Дата 3.3.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 14.4.2010

Репутация: нет
Всего: -3



Цитата(GremlinProg @  3.3.2011,  09:37 Найти цитируемый пост)
а чем этот листинг снят и в какой момент?

Process Explorer, после запуска программы.

Цитата(GremlinProg @  3.3.2011,  09:37 Найти цитируемый пост)
если это список статически подгружаемых модулей, то это ненормально,если это список модулей, подгружаемых в ран-тайме, то можно сказать, что это еще не так много,т.к. все модули, зависящие от подключаемого статикой тут будут так же видны

Объясните, пожалуйста, чем отличаются статически подгружаемые модули, от модулей, подгружаемых в ран-тайме?



PM MAIL   Вверх
GremlinProg
Дата 3.3.2011, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



в ран-тайме, т.е. динамически - это с помощью функции LoadLibrary
+ следует учесть, что модули сами могут статически подключать другие модули

Добавлено через 7 минут и 38 секунд
Цитата(neokoder @  3.3.2011,  15:05 Найти цитируемый пост)
Process Explorer

это как раз второй вариант,
а первый может дать например PE Explorer, на вкладке Import,
там будет список модулей, при отсутствии которых, приложение заведомо не будет запущено,
т.е. это непосредственные статические зависимости, их будет скорее всего не много,
их и можно/нужно контролировать при сборке проекта


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
neokoder
Дата 3.3.2011, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 14.4.2010

Репутация: нет
Всего: -3



Цитата(GremlinProg @  3.3.2011,  13:14 Найти цитируемый пост)
в ран-тайме, т.е. динамически - это с помощью функции LoadLibrary

Это понятно.

Цитата(GremlinProg @  3.3.2011,  13:14 Найти цитируемый пост)
а первый может дать например PE Explorer, на вкладке Import,там будет список модулей, при отсутствии которых, приложение заведомо не будет запущено,т.е. это непосредственные статические зависимости, их будет скорее всего не много,их и можно/нужно контролировать при сборке проекта


Не пойму всё же что вы имеете ввиду под "статически подгружаемые модули"?

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

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


PM MAIL   Вверх
Abyx
Дата 3.3.2011, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 2
Всего: 10



Цитата(neokoder @  2.3.2011,  13:21 Найти цитируемый пост)
И можно как-то уменьшить объём расходуемой памяти для такого приложения на чистом API? 

никак не уменьшить. такой расход памяти не из за особенностей приложения, а из за ОС
PM MAIL   Вверх
GremlinProg
Дата 4.3.2011, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(neokoder @  3.3.2011,  17:26 Найти цитируемый пост)
Не пойму всё же что вы имеете ввиду под "статически подгружаемые модули"?

статически, т.е. жестко, при сборке программы, в PE, в секции импорта
Цитата(Abyx @  3.3.2011,  17:50 Найти цитируемый пост)
такой расход памяти не из за особенностей приложения, а из за ОС

в основном - как раз из-за особенностей и количества ПО, установленного на нее


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
neokoder
Дата 4.3.2011, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 14.4.2010

Репутация: нет
Всего: -3



Цитата(GremlinProg @  4.3.2011,  11:32 Найти цитируемый пост)
статически, т.е. жестко, при сборке программы, в PE, в секции импорта

Ну это и есть тоже самое что и я говорю - использование библиотеки импорта вместо статической библиотеки.
PM MAIL   Вверх
xvr
Дата 5.3.2011, 08:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Посмотрите ваше приложение в Dependency Walker (Depends.Exe из общих тулзов в VS или PSDK). Там сразу будет видно, какая dll требуется непосредственно вашему приложению, а что попадает уже из ее требований.

PM MAIL   Вверх
volatile
Дата 5.3.2011, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата(neokoder @  2.3.2011,  13:21 Найти цитируемый пост)
можно как-то уменьшить объём расходуемой памяти для такого приложения на чистом API? 

посмотрите в сторону функции SetProcessWorkingSetSize(,,,);
Кроме-того можно еще уменьшить размер стека, в свойствах проекта.

PM MAIL   Вверх
neokoder
Дата 6.3.2011, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 14.4.2010

Репутация: нет
Всего: -3



Цитата(xvr @  5.3.2011,  08:25 Найти цитируемый пост)
Посмотрите ваше приложение в Dependency Walker (Depends.Exe из общих тулзов в VS или PSDK). Там сразу будет видно, какая dll требуется непосредственно вашему приложению, а что попадает уже из ее требований.


Я посмотрел. Тут такое дело, что без kernel32.dll, user32.dll, gdi32.dll(для окон) видимо не обойтись, а они уже подгружают другие библиотеки, которые им необходимы.

Я тут обнаружил интересную директиву #define WIN32_LEAN_AND_MEAN. Она позволяет иногда уменьшить размер расходуемой памяти, за счёт исключения редко используемых компонент во включаемых заголовочных файлах windows.
PM MAIL   Вверх
neokoder
Дата 6.3.2011, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 14.4.2010

Репутация: нет
Всего: -3



Цитата(volatile @  5.3.2011,  23:08 Найти цитируемый пост)
посмотрите в сторону функции SetProcessWorkingSetSize(,,,);Кроме-того можно еще уменьшить размер стека, в свойствах проекта.

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

Это сообщение отредактировал(а) neokoder - 6.3.2011, 16:55
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1061 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.