Составители:
(освобождения) блока. Более того, VirtualAlloc() позволяет размещать блок по
указанным (свободным) адресам (с учетом выравнивания на границу страницы) и
задавать для него уровень доступа, т.е. обеспечивает уровень управления
недоступный для функций динамического распределения памяти в MS DOS и MS
Windows 3.x. С другой стороны это усложняет работу по динамическому
распределению памяти. Иногда старая, простая дисциплина
работы с некоторой
"кучей" более удобна. И программист может использовать ее в программе. Для
этого существует набор функций работы с "кучами" (HeapCreate(), HeapAlloc() и
т.д.). Эти функции позволяют создать в программе несколько куч. Но, в любом
случае, процесс окажется владельцем хотя бы одной кучи. Эту кучу не нужно
создавать и нельзя
уничтожить, но стандартные функции malloc(), calloc() и т.д. и
операции new, delete распределяют память из этой кучи.
I. Имена, используемые в Windows для указателей и дескрипторов.
Application Programming Interface (API) включает в себя, помимо функций,
также большой набор имен для различных типов данных - синонимов для
стандартных типов и новых имен для новых составных типов. Каждая Windows-
программа содержит файл
windows.h "... поскольку он определяет очень широкий
набор констант, структур, макросов и функций, которые составляют скелет всех
Windows-программ". "Внутри windows.h вы найдете объявления ... большинства
функций и типов среды Windows". "windows.h - это место, где объясняются многие
таинства" [2]. Структура файла windows.h для новых (после 3.x) версий Windows
изменилась радикально. Теперь это небольшой файл, в который помещаются
директивы #include. Сами же определения
разбросаны по многим .h-файлам.
Поэтому для поиска нужной информации удобно использовать утилиты типа
grep.exe из пакета Borland C++.
ЗАДАНИЕ 1
. Найдите в файлах windows.h, windef.h и т.п. объявления имен
UINT, LPSTR, HANDLE, HINSTANCE, DWORD, HGLOBAL, LPVOID, BOOL,
GLOBALHANDLE и запишите как, в конечном счете, соответствующие
описания выражаются через стандартные типы языка Си. Попробуйте
определить назначение именованной константы STRICT.
II. Динамическое распределение памяти.
При запросе на динамическое выделение блока памяти указывается тип
блока: фиксированный (fixed), перемещаемый (movable) или удаляемый
(снимаемый, отбрасываемый) (discardable). Фиксированный
блок памяти Windows
может перемещать в физической памяти, но его виртуальный адрес остается
неизменным. Приложение имеет дело только с виртуальными адресами, поэтому
для работы с таким блоком можно использовать указатель, не интересуясь его
дескриптором. Movable-блок может быть перемещен Windows как в физическом,
так и в виртуальном адресном пространстве (чтобы избежать фрагментации
виртуальной памяти
). Неизменным останется лишь дескриптор блока. Поэтому при
работе с перемещаемым блоком памяти нужно сначала его заблокировать (вызвав
функцию GlobalLock см. ниже). Это приведет, во-первых, к фиксации виртуальных
адресов ячеек блока, во-вторых, функция вернет указатель на начало блока и, в-
(освобождения) блока. Более того, VirtualAlloc() позволяет размещать блок по указанным (свободным) адресам (с учетом выравнивания на границу страницы) и задавать для него уровень доступа, т.е. обеспечивает уровень управления недоступный для функций динамического распределения памяти в MS DOS и MS Windows 3.x. С другой стороны это усложняет работу по динамическому распределению памяти. Иногда старая, простая дисциплина работы с некоторой "кучей" более удобна. И программист может использовать ее в программе. Для этого существует набор функций работы с "кучами" (HeapCreate(), HeapAlloc() и т.д.). Эти функции позволяют создать в программе несколько куч. Но, в любом случае, процесс окажется владельцем хотя бы одной кучи. Эту кучу не нужно создавать и нельзя уничтожить, но стандартные функции malloc(), calloc() и т.д. и операции new, delete распределяют память из этой кучи. I. Имена, используемые в Windows для указателей и дескрипторов. Application Programming Interface (API) включает в себя, помимо функций, также большой набор имен для различных типов данных - синонимов для стандартных типов и новых имен для новых составных типов. Каждая Windows- программа содержит файл windows.h "... поскольку он определяет очень широкий набор констант, структур, макросов и функций, которые составляют скелет всех Windows-программ". "Внутри windows.h вы найдете объявления ... большинства функций и типов среды Windows". "windows.h - это место, где объясняются многие таинства" [2]. Структура файла windows.h для новых (после 3.x) версий Windows изменилась радикально. Теперь это небольшой файл, в который помещаются директивы #include. Сами же определения разбросаны по многим .h-файлам. Поэтому для поиска нужной информации удобно использовать утилиты типа grep.exe из пакета Borland C++. ЗАДАНИЕ 1. Найдите в файлах windows.h, windef.h и т.п. объявления имен UINT, LPSTR, HANDLE, HINSTANCE, DWORD, HGLOBAL, LPVOID, BOOL, GLOBALHANDLE и запишите как, в конечном счете, соответствующие описания выражаются через стандартные типы языка Си. Попробуйте определить назначение именованной константы STRICT. II. Динамическое распределение памяти. При запросе на динамическое выделение блока памяти указывается тип блока: фиксированный (fixed), перемещаемый (movable) или удаляемый (снимаемый, отбрасываемый) (discardable). Фиксированный блок памяти Windows может перемещать в физической памяти, но его виртуальный адрес остается неизменным. Приложение имеет дело только с виртуальными адресами, поэтому для работы с таким блоком можно использовать указатель, не интересуясь его дескриптором. Movable-блок может быть перемещен Windows как в физическом, так и в виртуальном адресном пространстве (чтобы избежать фрагментации виртуальной памяти). Неизменным останется лишь дескриптор блока. Поэтому при работе с перемещаемым блоком памяти нужно сначала его заблокировать (вызвав функцию GlobalLock см. ниже). Это приведет, во-первых, к фиксации виртуальных адресов ячеек блока, во-вторых, функция вернет указатель на начало блока и, в-
Страницы
- « первая
- ‹ предыдущая
- …
- 3
- 4
- 5
- 6
- 7
- …
- следующая ›
- последняя »