Выдиление памяти: расширение уже выделенной
Добрый вечер, вот возникла потребность выделить участок памяти, а потом расширить его (полный размер участка памяти сначала не известен). Выделять-то я знаю как, а вот расширить... я даже не знаю возможно ли ето :) Теоритически можно было б сделать так: Выделить участок, потом выделить участок по-больше, скопировать туда тот, что выделен раньше и освободить старый участок. Но у етого способа есть два минуса: адрес участка постоянно меняеться (при частом расширении), да и способ ломацкий какой-то :).
- HeapAlloc()/HeapRealloc()
- VirtualAlloc() + MEM_RESERVE (для больших объёмов можно в комбинации с MEM_TOP_DOWN) с последующим VirtualAlloc(..., ..., MEM_COMMIT, ...);
Второй способ предпочтительнее, тем более, если использовать его совместно со структурной обработкой исключений (SEH). Такой пример (spreadsheet) рассматривал в своей книге Дж. Рихтер.
The GlobalReAlloc function changes the size or attributes of a specified global memory object. The size can increase or decrease.
HGLOBAL GlobalReAlloc(
HGLOBAL hMem, // handle to the global memory object
DWORD dwBytes, // new size of the block
UINT uFlags // how to reallocate object
);
Выделить память:
The GlobalAlloc function allocates the specified number of bytes from the heap. In the linear Win32 API environment, there is no difference between the local heap and the global heap.
HGLOBAL GlobalAlloc(
UINT uFlags, // object allocation attributes
DWORD dwBytes // number of bytes to allocate
);
[quote=HarryAxe]
Второй способ предпочтительнее, тем более, если использовать его совместно со структурной обработкой исключений (SEH). Такой пример (spreadsheet) рассматривал в своей книге Дж. Рихтер.
[/quote]
Ну, не знаю на счёт Джеффри...
А я слышал наоборот, что Microsoft в какой-то там своей документации рекомендует использовать HeapAlloc()/HeapRealloc()...
А VirtualAlloc() следует использовать для выделения больших участков памяти не менее 64кбайт!
realloc() из сишных библиотек делает то же самое(вызывает HeapReAlloc()), только там вроде уже и используется SEH, и своего ничего не надо дописывать... :о)
Цитата:
А VirtualAlloc() следует использовать для выделения больших участков памяти не менее 64кбайт!
А что, жалко, что ли? В калькуляторе и то больше. Просто размер выделенной памяти будет кратен размеру страницы. Зато резервировать можно сразу гигами и мы не тратим время на работу менеджера кучи.
Цитата:
А что, жалко, что ли? В калькуляторе и то больше.
Это уж кому сколько надо...
Может быть просто нет необходимости выделять целую страницу...
Тогда GlobalAlloc или HeapAlloc...
Цитата:
А VirtualAlloc() следует использовать для выделения больших участков памяти не менее 64кбайт!
Вообще-то размер страницы зависит от платформы (на некоторых платформах их может и не быть). Под IA32 спокойно можно выделять память кратную размеру страницы, то биш 4кб.
Microsoft не рекоммендует имспользовать GlobalAlloc() ввиду медленной работы и ограниченности возможностей. В настоящее время её применение практически полностью ограничивается DDE, операциями с буфером обмена и OLE. Как говорится, use HeapAlloc() instead.
Цитата: HarryAxe
Microsoft не рекоммендует имспользовать GlobalAlloc() ввиду медленной работы и ограниченности возможностей.
насколько я помню функции GlobalAlloc и LocalAlloc нужны только для совметимости со cтарыми программами под Win16