Search code examples
winapivisual-c++heap-memorymsvcrt

How do I tell the MS CRT to use a Low Fragmentation Heap on Windows XP?


It appears that the MS CRT (msvcr80.dll from VS2005 in my case) uses a heap different from the standard process heap returned by GetProcessHeap().

On Windows XP, the default for a heap created with HeapCreate is non-low-fragmentation. How do I tell the CRT to use a Low Fragmentation Heap instead?


Solution

  • See the example here: _get_heap_handle :

    intptr_t _get_heap_handle( void );
    

    Returns the handle to the Win32 heap used by the C run-time system.

    Use this function if you want to call HeapSetInformation and enable the Low Fragmentation Heap on the CRT heap.

    // crt_get_heap_handle.cpp
    // compile with: /MT
    #include <windows.h>
    #include <malloc.h>
    #include <stdio.h>
    
    int main(void)
    {
        intptr_t hCrtHeap = _get_heap_handle();
        ULONG ulEnableLFH = 2;
        if (HeapSetInformation((PVOID)hCrtHeap,
                               HeapCompatibilityInformation,
                               &ulEnableLFH, sizeof(ulEnableLFH)))
            puts("Enabling Low Fragmentation Heap succeeded");
        else
            puts("Enabling Low Fragmentation Heap failed");
        return 0;
    }