Работа с большими массивами данных
С помощью функции GlobalAlloc приложения могут заказать блок памяти, превосходящий по своим размерам 64 кбайт. Операционная система разделяет такие блоки памяти на участки размером не более 64 Кбайт, причем для адресации всех этих участков используется несколько дескрипторов, расположенных друг за другом (рис. 2.11).
Рис. 2.11. Адресация большого блока памяти
В процессе выделения приложению большого блока памяти Windows может передвигать дескрипторы перемещаемых сегментов для освобождения нужного количества ячеек таблицы дескрипторов, расположенных рядом.
Для работы с блоками памяти размером более 64 Кбайт приложения, составленные на языках программирования С и С++ должны использовать указатели типа huge . Для таких указателей переключение селекторов, необходимое для получения доступа ко всему блоку памяти, выполняется автоматически.
Если вам потребуется создать приложение Windows или его отдельный модуль на языке ассемблера при помощи MASM, вы можете использовать значение __AHINCR для определения величины, которую нужно прибавить к селектору для того чтобы получить значение селектора, соответствующего следующему дескриптору.
Если вы в приложении Windows определяете данные с помощью ключевого слова huge, указатели на эти данные следует использовать с осторожностью. Несмотря на то, что все операции с указателями huge будут выполняться правильно, при передаче таких указателей функциям из программного интерфейса Windows могут возникнуть ошибки, если эти функции, изменяя полученный указатель, пересекут границу 64 Кбайт.