UNIX: разработка сетевых приложений | страница 29
1.11. 64-разрядные архитектуры
С середины до конца 90-х годов развивается тенденция к переходу на 64-разрядные архитектуры и 64-разрядное программное обеспечение. Одной из причин является более значительная по размеру адресация внутри процесса (например, 64-разрядные указатели), которая необходима в случае использования больших объемов памяти (более 2>32 байт). Обычная модель программирования для существующих 32-разрядных систем Unix называется ILP32. Ее название указывает на то, что целые числа (I), длинные целые числа (L) и указатели (P) занимают 32 бита. Модель, которая получает все большее распространение для 64-разрядных систем Unix, называется LP64. Ее название говорит о том, что 64 бита требуется только для длинных целых чисел (L) и указателей (P). В табл. 1.5 приводится сравнение этих двух моделей.
Таблица 1.5. Сравнение количества битов для хранения различных типов, данных в моделях ILP32 и LP64
| Тип данных | Модель ILP32 | Модель LP64 |
|---|---|---|
| Char | 8 | 8 |
| Short | 16 | 16 |
| Int | 32 | 32 |
| Long | 32 | 64 |
| Указатель | 32 | 64 |
С точки зрения программирования модель LP64 означает, что мы не можем рассматривать указатель как целое число. Мы также должны учитывать влияние модели LP64 на существующие API.
В ANSI С введен тип данных >size_t, который используется, например в качестве аргумента функции >malloc (количество байтов, которое данная функция выделяет в памяти для размещения какого-либо объекта), а также как третий аргумент для функций >read и >write (число считываемых или записываемых байтов). В 32-разрядной системе значение типа >size_t является 32-разрядным, но в 64-разрядной системе оно должно быть 64-разрядным, чтобы использовать преимущество большей модели адресации. Это означает, что в 64-разрядной системе, возможно, >size_t будет иметь тип >unsigned long (целое число без знака, занимающее 32 разряда). Проблемой сетевого интерфейса API является то, что в некоторых проектах по POSIX.1g было определено, что аргументы функции, содержащие размер структур адресов сокета, должны иметь тип >size_t (например, третий аргумент в функциях >bind и >connect). Некоторые поля структуры XTI также имели тип данных >long (например, структуры >t_info и >t_opthdr). Если бы стандарты остались неизменными, в обоих случаях 32-разрядные значения должны были бы смениться 64-разрядными при переходе с модели ILP32 на LP64. В обоих случаях нет никакой необходимости в 64-разрядных типах данных: длина структуры адресов сокета занимает максимум несколько сотен байтов, а использование типа данных