Читаем Системное программирование в среде Windows полностью

Наконец, заметьте, что в Win64 размер данных типа HANDLE составляет 64 бита.


Таблица 16.2. Типы данных, соответствующие точности указателей

Тип данныхОписание
DWORD_PTRДлинное целое без знака, соответствующее точности указателей.
HALF_PTRПоловина размера указателя. Используется в структурах, содержащих указатель и два поля небольшого размера.
INT_PTRЦелое со знаком, соответствующее точности указателей.
LONG_PTRДлинное целое со знаком, соответствующее точности указателей.
SIZE_TМаксимальное количество байтов, на которые может ссылаться указатель. Используется для счетчиков, которые должны охватывать весь диапазон возможных значений указателей.
SSIZE_TТип SIZE_T со знаком.
UHALF_PTRТип HALF_PTR без знака.
UINT_PTRТип INT_PTR без знака.
ULONG_PTRТип LONG_PTR без знака.

Пример: использование указательных типов данных

Аргументом потока, передаваемым функции потока при вызове CreateThread и _beginthreadex (см. главу 7), является указатель типа PVOID. Иногда программист может захотеть передать функции потока только целочисленное значение, указывающее, например, номер потока или индекс данных в глобальной таблице. Тогда функцию потока, интерпретирующую параметр как целое без знака, можно было бы написать следующим образом:

DWORD WINAPI MyThreadFunc(PVOID Index_PTR) {

 DWORD_PTR Index;

 …

 Index = (DWORD_PTR)Index_PTR;

 …

}

Аналогичным образом, зная, что фактический аргумент является целым числом, вы могли бы записать соответствующий участок кода основного потока следующим образом:

DWORD_PTR Ix;

for (Ix = 0; Ix < NumThreads; Ix++) {

 hTh[Ix] = _beginthreadex(NULL, 0, MyThreadFunc, (PVOID)Ix, 0, NULL);

 …

}

Заметьте, что в уже существующий код вам придется внести необходимые изменения. Об этом говорится далее в разделе "Перенос существующего кода".

Предостережение

Пока, по крайней мере, в случае первоначальных вариантов реализации, не следует рассчитывать на получение доступа ко всему виртуальному адресному пространству. Размер виртуальных адресных пространств может ограничиваться такими, например, значениями, как 512 Гбайт, что соответствует ограничению данных 39 битами. Можно надеяться, что со временем, по мере эволюции процессоров и систем, указанный верхний предел увеличится.

Различия между Windows и UNIX

В Windows и UNIX выбраны различные стратегии. Большинство поставщиков UNIX-систем реализуют модель LP64, в которой размер как длинного целочисленного, так и указательного типов данных составляет 64 бита. Такую модель иногда называют моделью "I32, LP64", чтобы подчеркнуть тот факт, что размер данных типа int по-прежнему составляет 32 бита. Таким образом, различие между обеими системами в рассматриваемом нами смысле сводится к различию в размерах целых чисел типа long. К тому же, типы данных, перечисленные в таблицах 16.1 и 16.2, приняты только в Windows.

Для каждой из двух моделей имеются разумные обоснования, и в белых страницах "Aspen", фигурирующих в списке дополнительной литературы к этой главе, приводятся аргументы, объясняющие выбор, сделанный в UNIX. И все же, было бы гораздо удобнее, если бы в обеих ОС действовали одни и те же соглашения.

Перенос имеющегося программного кода

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже