Глобальные и локальные функции
Глобальные и локальные функции поддерживаются для переноса из 16-разрядного кода или обеспечения совместимости исходного кода с 16-разрядной версией Windows. Начиная с 32-разрядной версии Windows глобальные и локальные функции реализуются как функции-оболочки, которые вызывают соответствующие функции кучи с помощью дескриптора кучи по умолчанию процесса. Таким образом, глобальные и локальные функции имеют большую нагрузку, чем другие функции управления памятью.
Функции кучи обеспечивают больше функций и управления, чем глобальные и локальные функции. Новые приложения должны использовать функции кучи, если только документация не указывает, что следует использовать глобальную или локальную функцию. Например, некоторые функции Windows выделяют память, которую необходимо освободить с помощью LocalFree, а глобальные функции по-прежнему используются с динамическим обменом данными (DDE), функциями буфера обмена и объектами данных OLE. Полный список глобальных и локальных функций см. в таблице в функциях управления памятью.
Управление памятью Windows не предоставляет отдельную локальную кучу и глобальную кучу, так как 16-разрядная windows делает. В результате глобальные и местные семьи функций эквивалентны, и выбор между ними является вопросом личного предпочтения. Обратите внимание, что изменение модели 16-разрядной сегментированного памяти на 32-разрядную модель виртуальной памяти сделало некоторые связанные глобальные и локальные функции и их параметры ненужными или бессмысленными. Например, больше нет рядом и далеко указателей, так как локальные и глобальные выделения возвращают 32-разрядные виртуальные адреса.
Объекты памяти, выделенные GlobalAlloc и LocalAlloc находятся на закрытых, зафиксированных страницах с доступом на чтение и запись, к которым не удается получить доступ к другим процессам. Память, выделенная с помощью GlobalAlloc с GMEM_DDESHARE, не предоставляется глобально, так как она находится в 16-разрядной windows. Это значение не действует и доступно только для совместимости. Приложения, требующие общей памяти для других целей, должны использовать объекты сопоставления файлов. Несколько процессов могут сопоставить представление одного объекта сопоставления файлов для предоставления именованной общей памяти. Дополнительные сведения см. в сопоставления файлов.
Выделение памяти ограничено только доступной физической памятью, включая хранилище в файле подкачки на диске. При выделении фиксированной памяти GlobalAlloc и LocalAlloc возвращают указатель, который вызывающий процесс может немедленно использовать для доступа к памяти. При выделении перемещаемой памяти возвращаемое значение является дескриптором. Чтобы получить указатель на перемещаемый объект памяти, используйте функции GlobalLock и функции LocalLock.
Фактический размер выделенной памяти может превышать запрошенный размер. Чтобы определить фактическое количество выделенных байтов, используйте функцию GlobalSize или LocalSize. Если выделенный объем превышает запрошенную сумму, процесс может использовать всю сумму.
Функции GlobalReAlloc и LocalReAlloc изменяют размер или атрибуты объекта памяти, выделенного GlobalAlloc и LocalAlloc. Размер может увеличиваться или уменьшаться.
Функции GlobalFree и LocalFree, выделенные GlobalAlloc, LocalAlloc, GlobalReAllocили LocalReAlloc. Чтобы отменить указанный объект памяти без недопустимого дескриптора, используйте функцию GlobalDiscard или LocalDiscard. Дескриптор можно использовать позже GlobalReAlloc или LocalReAlloc для выделения нового блока памяти, связанного с тем же дескриптором.
Чтобы вернуть сведения об указанном объекте памяти, используйте функциюglobalFlagsилиLocalFlags. Сведения включают число блокировок объекта и указывают, является ли объект отмененным или уже удален. Чтобы вернуть дескриптор в объект памяти, связанный с указанным указателем, используйте функцию GlobalHandle или LocalHandle.
Связанные разделы