Глобальные и локальные функции

Глобальные и локальные функции поддерживаются для переноса из 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 .

Сравнение методов выделения памяти