Porovnání metod přidělování paměti

Výběr správné metody přidělování

Při výběru vhodného rozhraní API pro přidělení paměti pro váš scénář použijte následující doprovodné materiály:

Scénář Doporučené rozhraní API Poznámky
Přidělení C++ pro obecné účely new / std::make_unique / std::make_shared Výchozí volba pro kód jazyka C++. Používá haldu CRT interně. RAII zajišťuje automatické vyčištění.
Přidělení jazyka C pro obecné účely malloc / calloc / realloc Výchozí volba pro kód jazyka C Přenosná napříč platformami.
Přidělení větší než ~1 MB nebo vyžadování ovládacího prvku na úrovni stránky VirtualAlloc Přiděluje členitost stránky (obvykle 4 kB). Slouží k rezervaci velkých rozsahů adres, strážných stránek nebo paměti s konkrétními atributy ochrany (PAGE_READWRITEatd PAGE_EXECUTE_READ.).
Mnoho malých přidělení pomocí vlastního ovládacího prvku (např. alokátor fondu) HeapAlloc / HeapCreate Vytvořte privátní haldu pro izolaci nebo serializaci řízení. Používejte HEAP_NO_SERIALIZE pouze v případě, že halda je výhradně jednovláknová.
Zprostředkovatele komunikace s objekty COM (zařazovaná paměť) CoTaskMemAlloc Vyžaduje se, když paměť překročí hranice bytu modelu COM. MIDL generované zástupné procedury používají CoTaskMemAlloc/CoTaskMemFree.
Starší verze kódu využívající přesunoutelnou paměť GlobalAlloc / LocalAlloc Vyhněte se novému kódu. Tyto operace přidávají režii nad heapAlloc a existují především kvůli zpětné kompatibilitě s operacemi schránky a určitými rozhraními API Win32, která je vyžadují.

Important

Funkce přidělování a uvolnění vždy správně spárujte. Paměť přidělená pomocí musí být uvolněna HeapAllocHeapFree , nikoli free() nebo LocalFree. Kombinování rodin přidělení nebo zrušení přidělení způsobuje poškození haldy, které je obtížné diagnostikovat.

Note

VirtualAlloc vs HeapAlloc: VirtualAlloc funguje v členitosti stránky (minimálně 4 kB, rezervace zarovnané s SYSTEM_INFO.dwAllocationGranularity, obvykle 64 kB). Přidělování mnoha malých objektů pomocí virtualAllocu ztrácí adresní prostor. Použijte heapAlloc (nebo malloc/new) pro malé a časté přidělení. VirtualAlloc použijte, když potřebujete rezervovat velké oblasti adres, řídit ochranu stránky nebo implementovat vlastní alokátory.

Podrobné porovnání

Následuje stručné porovnání různých metod přidělování paměti:

Přestože funkce GlobalAlloc, LocalAlloc a HeapAlloc nakonec přidělují paměť ze stejné haldy, každá z nich poskytuje mírně odlišnou sadu funkcí. HeapAlloc může být například instruován k vyvolání výjimky, pokud paměť nelze přidělit, schopnost není k dispozici v LocalAlloc. LocalAlloc podporuje přidělení popisovačů, které umožňují přesunutí podkladové paměti relokací beze změny hodnoty popisovače, schopnost není k dispozici v HeapAlloc.

Počínaje 32bitovou Windows se globalAlloc a LocalAlloc implementují jako obálkové funkce, které volají HeapAlloc pomocí popisovače výchozí haldy procesu. Proto mají GlobalAlloc a LocalAlloc větší režii než HeapAlloc.

Vzhledem k tomu, že různé alokátory haldy poskytují charakteristické funkce pomocí různých mechanismů, musíte uvolnit paměť se správnou funkcí. Například paměť přidělená heapAlloc musí být uvolněna s HeapFree a nikoli LocalFree nebo GlobalFree. Paměť přidělená funkcí GlobalAlloc nebo LocalAlloc musí být dotazována, ověřena a vydána s odpovídající globální nebo místní funkcí.

Funkce VirtualAlloc umožňuje zadat další možnosti přidělení paměti. Přidělení ale používají členitost stránky, takže použití nástroje VirtualAlloc může vést k vyššímu využití paměti.

Funkce malloc má nevýhodu, že je závislá na době běhu. Nový operátor má nevýhodu závislého kompilátoru a závislého jazyka.

Funkce CoTaskMemAlloc má výhodu práce v jazyce C, C++ nebo Visual Basic. Je to také jediný způsob, jak sdílet paměť v aplikaci založené na modelu COM, protože MIDL používá CoTaskMemAlloc a CoTaskMemFree k zařazování paměti.

Examples

Globální a místní funkce

Funkce haldy

Funkce virtuální paměti