Глобальные и локальные функции реализованы для поддержки портирования 16-битного кода, или для поддержки приложения, содержащего 16-битный код. Эти функции работают медленнее, чем остальные функции менеджера памяти. Поэтому новые приложения должны использовать функции по работе с кучей. Тем не менее, глобальные функции все еще используются при работе с DDE и областью обмена.
Функции менеджера памяти в Win32 не поддерживают разделение памяти на локальную и глобальную, как это было в Win16. Поэтому не существует различий в блоках памяти, получаемых при вызове функций GlobalAlloc и LocalAlloc. Еще отметим, что переход от 16-битной сегментированной к 32-битной виртуальной модели памяти сделал некоторые локальные и глобавльные функции а также их опции ненужными или бессмысленными. Например, больше не существует различий между ближними и дальными указателями, поэтому и локальная, и глобальная функции вернут 32-битный виртуальный адрес.
Объекты памяти, которые были выделены при помощи функций GlobalAlloc и LocalAlloc, являются скрытыми страницами, которым передана физическая память с атрибутом чение/запись, и поэтому не могут быть доступны из других приложений. Память, выделенная при помощи функции GlobalAlloc с атрибутом GMEM_DDESHARE, теперь не являтся памятью, разделяемой между процессами, как это было в 16-битной Windows. Теперь этот флаг не имеет значения и поддерживается только в целях совместимости. Приложения, требующие разделения памяти между различными процессами, должны использовать файла проецируемые в память. Несколько процессов могут просмотреть содержимое файла, спроецированного в память, зная его имя. Для более детальной мнформации смотрите раздел "Файлы проецируемые в память".
Функции, которые производят выделение памяти, ограничены только общим размером физической памяти, включая файл подкачки. Когда вы производите выделение фиксированной памяти при помощи функций GlobalAlloc и LocalAlloc, память, расположенная по возвращенному указателю сразу же доступна для использования. Когда вы выделеяте перемещаемый блок памяти, то возвращаемым значением является дескриптор. Для того, чтобы получить указатель на перемещаемумю память, вы должны использовать функции GlobalLock и LocalLock. Размер выделенного блока может быть больше запрашиваемого. Для того, чтобы узнать действительное число байт, которое было выделено, следует использовать функции GlobalSize и LocalSize. Если выделенный размер больше запрашиваемого, то процесс может использовать получившийся остаток.
Функции GlobalReAlloc и LocalReAlloc используются для того, чтобы изменить размер объекта памяти, выделенного при помощи функций GlobalAlloc.html и LocalAlloc. Размер блока памяти может быть как увеличен, так и уменьшен.
Функции GlobalFree и LocalFree освобождают память, которая была выделена при помощи функций GlobalAlloc, LocalAlloc, GlobalReAlloc и LocalReAlloc. Для того, чтобы освободить объект в памяти без уничтожения его дескриптора, следует пользоваться функциями GlobalDiscard и LocalDscard. Оставшийся дескриптор может быть в дальнейшем использован функциями GlobalReAlloc и LocalReAlloc для того, чтобы выделить новый блок в памяти, связанный с этим дескриптором.
Для того, чтобы получить информацию об объекте в памяти, следует использовать функции GlobalFlags и LocalFlags. Эта информация включает в себя количество блокировок объекта, и показывает, может ли этот объект быть осовбожден без уничтожения дескриптора и не случилось ли это. Для того, чтобы получить дескриптор, связанный с заданным указателем, следует использовать функции GlobalHandle и LocalHandle.
Отличия Windows 95/98
Менеджер памяти для кучи спроектирован так, что размер одного блока не может
превышать четыре мегабайта. Поэтому, если вы рассчитываете оперировать с блоками
размером более одного или двух мегабайт, то для этой цели мы рекомендуем
пользоваться функциями VirtualAlloc и
VirtualAllocEx.
Глобальные и локальные функции |
Справочник![]() |
© Mystic, 2002