Для некоторых операционных систем и процессоров стандартную порцию данных не называют машинным
Для каждой аппаратной платформы, поддерживаемой операционной системой Linux, в файле
BITTS_PER_LONG
, которая равна размеру типа long языка С и совпадает с размером машинного слова системы. Полный список всех поддерживаемых аппаратных платформ и их размеры машинного слова приведены в табл. 19.1.Таблица 19.1
. Поддерживаемые аппаратные платформыАппаратная платформа | Описание | Размер машинного слова |
---|---|---|
alpha | Digital Alpha | 64 бит |
arm | ARM и StrongARM | 32 бит |
cris | CRIS | 32 бит |
h8300 | H8/300 | 32 бит |
I386 | Intel x86 | 32 бит |
ia64 | IA-64 | 64 бит |
m68k | Motorola 68k | 32 бит |
m86knommu | m68k без устройства MMU | 32 бит |
mips | MIPS | 32 бит |
mips64 | 64-разрядная MIPS | 64 бит |
parisc | HP PA-RISC | 32 бит, или 64 бит |
ppc | PowerPC | 32 бит |
ppc64 | POWER | 64 бит |
s390 | IBM S/390 | 32 бит, или 64 бит |
sh | Hitachi SH | 32 бит |
sparс | SPARC | 32 бит |
sparc64 | UltraSPARC | 64 бит |
um | Usermode Linux | 32 бит, или 64 бит |
v850 | v850 | 32 бит |
x86_64 | X86-64 | 64 бит |
Стандарт языка С явно указывает, что размер памяти, которую занимают переменные стандартных типов данных, зависит от аппаратной реализации[93]
, при этом также определяется минимально возможный размер типа. Неопределенность размеров стандартных типов языка С для различных аппаратных платформ имеет свои положительные и отрицательные стороны. К плюсам можно отнести то, что для стандартных типов языка С можно пользоваться преимуществами, связанными с размером машинного слова, а также отсутствие необходимости явного указания размера. Для ОС Linux размер типаlong
гарантированно равен размеру машинного слова. Это не совсем соответствует стандарту ANSI С, однако является стандартной практикой в ОС Linux. Как недостаток можно отметить, что при разработке кода нельзя рассчитывать на то, что данные определенного типа занимают в памяти определенный размер. Более того, нельзя гарантировать, что переменные типа int
занимают столько же памяти, сколько и переменные типа long
[94].Ситуация еще более запутывается тем, что одни и те же типы данных в пространстве пользователя и в пространстве ядра не обязательно должны соответствовать друг другу. Аппаратная платформа sparc64 предоставляет 32-разрядное пространство пользователя, а поэтому указатели, типы int
long
имеют размер 32 бит. Однако в пространстве ядра для аппаратной платформы размер типа int равен 32 бит, а размер указателей и типа long
равен 64 бит. Тем не менее такая ситуация не является обычной.Всегда необходимо помнить о следующем.
• Как и требует стандарт языка С, размер типа char
• Нет никакой гарантии, что размер типа int
• То же касается и типа short
• Никогда нельзя надеяться, что тип long
• Так как размер типа long
sizeof(int) == sizeof(long)
.• Точно так же нельзя предполагать, что размер типа int