Составители:
HANDLE HeapCreate ( DWORD dwOptions, // флаг выделения кучи
DWORD dwInitialSize, // начальный размер кучи
DWORD dwMaximumSize ); // максимальный размер кучи
"За кулисами" подсистема Win32 реагирует на эту функцию, резервируя блок па-
мяти максимального размера и закрепляя страницы, которые определяют начальный
размер кучи. Последующие выделения памяти приводят к увеличению или уменьшению
объема кучи. Если для очередного выделения памяти потребуются новые страницы, ко-
манды для работы с кучей автоматически закрепят их. Страницы остаются закреплен-
ными до тех пор, пока куча не будет уничтожена или пока сама программа не завершит-
ся.
Система не может управлять содержимым локальной кучи, уплотнять кучу или пе-
ремещать объекты внутри нее. Поэтому не исключено, что после многократного выде-
ления и освобождения большого количества мелких объектов куча станет фрагментиро-
ванной. Если при очередном выделении памяти куча достигает максимального размера,
все последующие выделения не совершаются. Однако если аргумент dwMaximumSize
равен 0, размер кучи ограничивается объемом доступной памяти.
Параметр dwOptions позволяет установить один-единственный флаг -
HEAP_NO_SERIALIZE. По умолчанию без этого флага (значение аргумента равно 0)
куча не допускает взаимодействия посредством потоков, которые совместно используют
дескрипторы памяти. Сериализованная куча препятствует одновременному выполнению
нескольких операций с одним дескриптором. Один из потоков блокируется до тех пор,
пока другой поток не завершит выполнение своей операции. Сериализация несколько
снижает быстродействие. Если в программе реализован только один поток, если только
один из нескольких потоков программы обращается к куче или если программа само-
стоятельно обеспечивает защиту кучи (например, путем создания исключающего сема-
фора или критического раздела), сериализация кучи не требуется.
Функции HeapAlloc, HeapReAlloc и HeapFree осуществляют выделение, повторное
выделение и освобождение блоков памяти из кучи. Все эти функции в качестве одного
из аргументов принимают дескриптор, возвращенный функцией HeapCreate.
LPSTR HeapAlloc( HANDLE hHeap, // дескриптор локальной кучи
DWORD dwFlags, // управляющие флаги
DWORD dwBytes ); // количество выделяемых байтов
Функция HeapAlloc возвращает указатель блока необходимого размера. Ей могут
быть переданы два управляющих флага.
HEAP_GENERATE_EXCEPTIONS - Этот флаг определяет, как, команда будет обраба-
тывать ошибки. Если он не установлен, функция HeapAlloc сообщает об ошибке, воз-
вращая значение NULL. Если флаг установлен, в ответ на любую ошибку функция по-
рождает исключение.
HEAP_ZERO_MEMORY - Этот флаг дает функции HeapAlloc указание инициализиро-
вать новый выделенный блок, заполняя его нулями. При успешном выполнении функ-
ция выделяет столько памяти, сколько требуется, или немного больше, чтобы достичь
ближайшей границы страницы.
Чтобы узнать точный размер любого блока, вызовите функцию HeapSize. Наряду с
байтами блока при каждом выделении будет задействовано несколько дополнительных
байтов, необходимых для поддержки внутренней структуры динамической области па-
мяти. Точный размер этого дополнительного кусочка памяти варьируется и составляет в
среднем около 16 байтов. Вы должны знать это, потому что без учета подобных "на-
кладных расходов" не сможете выделить из кучи столько блоков, сколько предполагали.
120
HANDLE HeapCreate ( DWORD dwOptions, // флаг выделения кучи
DWORD dwInitialSize, // начальный размер кучи
DWORD dwMaximumSize ); // максимальный размер кучи
"За кулисами" подсистема Win32 реагирует на эту функцию, резервируя блок па-
мяти максимального размера и закрепляя страницы, которые определяют начальный
размер кучи. Последующие выделения памяти приводят к увеличению или уменьшению
объема кучи. Если для очередного выделения памяти потребуются новые страницы, ко-
манды для работы с кучей автоматически закрепят их. Страницы остаются закреплен-
ными до тех пор, пока куча не будет уничтожена или пока сама программа не завершит-
ся.
Система не может управлять содержимым локальной кучи, уплотнять кучу или пе-
ремещать объекты внутри нее. Поэтому не исключено, что после многократного выде-
ления и освобождения большого количества мелких объектов куча станет фрагментиро-
ванной. Если при очередном выделении памяти куча достигает максимального размера,
все последующие выделения не совершаются. Однако если аргумент dwMaximumSize
равен 0, размер кучи ограничивается объемом доступной памяти.
Параметр dwOptions позволяет установить один-единственный флаг -
HEAP_NO_SERIALIZE. По умолчанию без этого флага (значение аргумента равно 0)
куча не допускает взаимодействия посредством потоков, которые совместно используют
дескрипторы памяти. Сериализованная куча препятствует одновременному выполнению
нескольких операций с одним дескриптором. Один из потоков блокируется до тех пор,
пока другой поток не завершит выполнение своей операции. Сериализация несколько
снижает быстродействие. Если в программе реализован только один поток, если только
один из нескольких потоков программы обращается к куче или если программа само-
стоятельно обеспечивает защиту кучи (например, путем создания исключающего сема-
фора или критического раздела), сериализация кучи не требуется.
Функции HeapAlloc, HeapReAlloc и HeapFree осуществляют выделение, повторное
выделение и освобождение блоков памяти из кучи. Все эти функции в качестве одного
из аргументов принимают дескриптор, возвращенный функцией HeapCreate.
LPSTR HeapAlloc( HANDLE hHeap, // дескриптор локальной кучи
DWORD dwFlags, // управляющие флаги
DWORD dwBytes ); // количество выделяемых байтов
Функция HeapAlloc возвращает указатель блока необходимого размера. Ей могут
быть переданы два управляющих флага.
HEAP_GENERATE_EXCEPTIONS - Этот флаг определяет, как, команда будет обраба-
тывать ошибки. Если он не установлен, функция HeapAlloc сообщает об ошибке, воз-
вращая значение NULL. Если флаг установлен, в ответ на любую ошибку функция по-
рождает исключение.
HEAP_ZERO_MEMORY - Этот флаг дает функции HeapAlloc указание инициализиро-
вать новый выделенный блок, заполняя его нулями. При успешном выполнении функ-
ция выделяет столько памяти, сколько требуется, или немного больше, чтобы достичь
ближайшей границы страницы.
Чтобы узнать точный размер любого блока, вызовите функцию HeapSize. Наряду с
байтами блока при каждом выделении будет задействовано несколько дополнительных
байтов, необходимых для поддержки внутренней структуры динамической области па-
мяти. Точный размер этого дополнительного кусочка памяти варьируется и составляет в
среднем около 16 байтов. Вы должны знать это, потому что без учета подобных "на-
кладных расходов" не сможете выделить из кучи столько блоков, сколько предполагали.
120
Страницы
- « первая
- ‹ предыдущая
- …
- 116
- 117
- 118
- 119
- 120
- …
- следующая ›
- последняя »
