Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Функции выделения памяти


Автор: knave 8.2.2005, 13:53
Объясните в чем разница между памятью выделенной через new или malloc и этими апи функциями GlobaAlloc LocalAlloc

Почему то во многих системных и мультимедийных приложениях используют именно последние? Чем это обусловленно.

Автор: azesmcar 8.2.2005, 14:26
MSDN
Цитата
Note  The global functions are slower than other memory management functions and do not provide as many features. Therefore, new applications should use the heap functions. However, the global functions are still used with DDE, the clipboard functions, and OLE data objects.


GlobalAlloc и LocalAlloc выделяют память соответственно из глобальной и локальной кучи.

new и malloc отличаются тем что malloc не вызывает конструктор при выделении памяти для обьекта, он только выделяет память, new к тому же вызывает конструктор...

А насчет того зачем используют GlobalAlloc вместо malloc могу только догадаться...
malloc это CRT (C RunTime) функция, в итоге она вызывает тот же самый GlobalAlloc или LocalAlloc или HeapAlloc точно сказать не могу, под линукс тот же malloc работает но уже вызывает соответственно линуксовские системные вызовы (это как API).

Автор: knave 8.2.2005, 19:42
malloc - скорее всего она делает память перемещаемой. Я посмотрел, везде где юзают xxxxxAlloc ставят Флаг FIXED или LPTR (FIXED | ZEROINIT). Наверное чтобы ОС непереместила куда нить кусок памяти пока ее кто то обрабатывает (чтобы ненао было делать Lock/Unlock).

Автор: oleg1973 8.2.2005, 21:36
никакого malloc в winapi нет и небыло smile
делаем GlobalAlloc,GMEM_FIXED,size
и не мучаемся smile

Автор: Fixin 8.2.2005, 22:41
oleg1973
Цитата
делаем GlobalAlloc,GMEM_FIXED,size
Ну так почему все-таки?

Автор: oleg1973 9.2.2005, 02:16
Fixin
что именно почему?

Автор: Fixin 9.2.2005, 18:43
В чем разница для винда между new и ****Alloc. Если для простых смертных. На что влияет GMEM_. Я не пользовался раньше.

Автор: chipset 10.2.2005, 03:26
Цитата(knave @ 8.2.2005, 02:53)
Объясните в чем разница между памятью выделенной через new или malloc и этими апи функциями GlobaAlloc LocalAlloc

new - чисто С++'овский оператор, выделяет память под класс+вызывает конструктор
malloc - устаревший оператор Си, из библиотеки CRT. Выделяет определенное кол-во памяти.
GlobalAlloc, LocaAlloc - функции Win32Api.
Цитата(knave @ 8.2.2005, 02:53)
Почему то во многих системных и мультимедийных приложениях используют именно последние? Чем это обусловленно.

malloc устаревший оператор, и использование его вместе с С++-структурой как то не очень хороший стиль..
Некоторые люди не юзают STL, и вместо этого им приходится использовать ReadFile/WriteFile из Win32Api, где удобнее и уместнее воспользоваться аналогичным оператором WinApi.
Ну и кроме того, ты же понимаешь что дополнительная цепочка вызовов функций скушает ресурсы, что нехорошо для системных и мультимедийных прилаг smile
Добавлено @ 03:27
Цитата(Fixin @ 9.2.2005, 07:43)
В чем разница для винда между new и ****Alloc. Если для простых смертных. На что влияет GMEM_. Я не пользовался раньше.

Если ты насчёт ****Alloc то там ещё есть такая фича как HeapAlloc, которая позволяет работать с кучами..

Автор: Fixin 10.2.2005, 18:50
Я не про то. Я про виды выделяемой памяти флагами GME_******. Каки е виды бывают и в чем разница?

Автор: _hunter 10.2.2005, 19:19
открываем справку и читаем:
Цитата
GHND
0x0042 Combines GMEM_MOVEABLE and GMEM_ZEROINIT.
GMEM_FIXED
0x0000 Allocates fixed memory. The return value is a pointer.
GMEM_MOVEABLE
0x0002 Allocates movable memory. Memory blocks are never moved in physical memory, but they can be moved within the default heap.
The return value is a handle to the memory object. To translate the handle into a pointer, use the GlobalLock function.

This value cannot be combined with GMEM_FIXED.

GMEM_ZEROINIT
0x0040 Initializes memory contents to zero.
GPTR
0x0040 Combines GMEM_FIXED and GMEM_ZEROINIT.

;)

Автор: Fixin 10.2.2005, 19:20
Ну объясните, что за передвижимая память и непередвижимая.

Автор: _hunter 10.2.2005, 21:02
опять смотрим в справку:
Цитата
Fixed memory is accessed through a regular pointer, and will never move. Movable memory is accessed through a "handle" (which is a pointer to a pointer). The Memory Manager can therefore do heap compactions of such moveable blocks simply by updating the second pointer (ie, the one pointed to by the handle). This avoids heap fragmentation, but increases program complexity as well as the risk for "interesting" bugs.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)