Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> область применения функций выделения памяти, GlobalAlloc, HeapAlloc, VirtualAlloc, Vi 
:(
    Опции темы
Rennigth
Дата 23.11.2007, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76



Всем привет. У меня недавно появилось убеждение что я плаваю в вопросе выделения памяти. Хочеться ясности. Существует несколько функций выделения памяти:
GlobalAlloc, HeapAlloc, VirtualAlloc, VirtualAllocEx,  LocalAlloc (может какую пропустил), так вот меня интересует область применения каждой из них. Мсдн по ним я читал Memory Management Functions вроде все понятно что какая делает. Меня именно интересует в каких случаях какую применять. Вот. Поделитесь мыслями если не сложно.




--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexeis
Дата 23.11.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



GlobalAlloc - выделяет память доступную для нескольких процессов. Работает медленно. Не рекомендуется использовать. Замена File Mapping Object.

VirtualAlloc, VirtualAllocEx - это основные функции для выделения/резервирования страниц памяти в Windows. Работают быстро, но не умеет выделять куски меньше 4кб. 

HeapAlloc, LocalAlloc - это вторичные функции, используют API механизм работы c кучей (вызывают VirtualAlloc для резервирования места под кучу). Позволяют выделять маленькие куски, но работают медленно, та что никому не нужны smile , ведь делфячий менеджер кучи намного круче.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 23.11.2007, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76



т.е. по сути получается юзать надо или делфевый менеджер памяти или VirtualAlloc(VirtualAllocEx для не своих процессов). Пасиб за информацию. 

PS: кстати делфевый что на чем основан? у него какой-то свой механизм, или всеже использует какой-нить VirtualAlloc? дебагером не смог установить... :(

Добавлено через 13 минут
вот что делфя делает, но что-то мне на вскидку не о чем не говорит :(

Код

SysGetMem:
004017A0 8D5003           lea edx,[eax+$03]
004017A3 C1EA03           shr edx,$03
004017A6 3D2C0A0000       cmp eax,$00000a2c
004017AB 53               push ebx
004017AC 8A0D49904500     mov cl,[$00459049]
004017B2 0F872C020000     jnbe $004019e4
004017B8 84C9             test cl,cl
004017BA 0FB682BC954500   movzx eax,[edx+$004595bc]
004017C1 8D1CC53C704500   lea ebx,[eax*8+$45703c]
004017C8 7556             jnz $00401820
004017CA 8B5304           mov edx,[ebx+$04]
004017CD 8B4208           mov eax,[edx+$08]
004017D0 B9F8FFFFFF       mov ecx,$fffffff8
004017D5 39DA             cmp edx,ebx
004017D7 7417             jz $004017f0
004017D9 83420C01         add dword ptr [edx+$0c],$01
004017DD 2348FC           and ecx,[eax-$04]
004017E0 894A08           mov [edx+$08],ecx
004017E3 8950FC           mov [eax-$04],edx
004017E6 7428             jz $00401810
004017E8 C60300           mov byte ptr [ebx],$00
004017EB 5B               pop ebx
004017EC C3               ret 



Никаких вызовов Alloc-ов, значит что-то свое.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
Alexeis
Дата 23.11.2007, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Цитата(Rennigth @  23.11.2007,  17:46 Найти цитируемый пост)
у него какой-то свой механизм, или всеже использует какой-нить VirtualAlloc

VirtualAlloc - это краеугольный камень в выделении памяти юзер мод процессов. Конечно же ее.
Вот этот метод реально резервирует память.

Код

function Commit(addr: Pointer; minSize: Integer): TBlock;
// Commits memory.
// Returns the block that was actually committed.
// Will return a block with addr = nil on failure.
var
  bd: PBlockDesc;
  loAddr, hiAddr, startAddr, endAddr: PChar;
begin
  startAddr := PChar(Integer(addr) and not (cPageAlign-1));
  endAddr := PChar(((Integer(addr) + minSize) + (cPageAlign-1)) and not (cPageAlign-1));
  result.addr := startAddr;
  result.size := endAddr - startAddr;
  bd := spaceRoot.next;
  while bd <> @spaceRoot do begin
    // Commit the intersection of the block described by bd and [startAddr..endAddr)
    loAddr := bd.addr;
    hiAddr := loAddr + bd.size;
    if loAddr < startAddr then
      loAddr := startAddr;
    if hiAddr > endAddr then
      hiAddr := endAddr;
    if loAddr < hiAddr then begin
      if VirtualAlloc(loAddr, hiAddr - loAddr, MEM_COMMIT, PAGE_READWRITE) = nil then begin
        result.addr := nil;
        exit;
      end;
    end;
    bd := bd.next;
  end;
end;


Добавлено через 2 минуты и 14 секунд
Rennigth, поставь галочку Debug DCU и по F7 зайди в GetMem. Если блок был достаточно большой (т.е. не хватит резервного места), то он зайдет в эту функцию.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Rennigth
Дата 23.11.2007, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1708
Регистрация: 21.6.2004
Где: Moscow

Репутация: 8
Всего: 76



Цитата(Alexeis @  23.11.2007,  18:00 Найти цитируемый пост)
VirtualAlloc - это краеугольный камень в выделении памяти юзер мод процессов. Конечно же ее.
Вот этот метод реально резервирует память.

т.е. основываясь на 
Цитата(Alexeis @  23.11.2007,  17:36 Найти цитируемый пост)
Работают быстро, но не умеет выделять куски меньше 4кб. 

когда мы вызываем GetMemory(1) по сути мы все равно 4к выделяем? или медеджер как-то рулит этим.

Добавлено через 5 минут и 1 секунду
Цитата(Alexeis @  23.11.2007,  18:00 Найти цитируемый пост)
Если блок был достаточно большой (т.е. не хватит резервного места), то он зайдет в эту функцию. 

ясно.


--------------------
(* Honesta mors turpi vita potior *)
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

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


 




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


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

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