size_t определяется стандартом C как целое без знака, возвращаемое оператором sizeof (C99 6.3.5.4.4) и аргументом malloc и его друзей (C99 7.20.3.3 и т. д.). Фактический диапазон устанавливается таким, чтобы максимальное значение (SIZE_MAX) составляло не менее 65 535 (C99 7.18.3.2).
Однако это не позволяет нам определить sizeof(size_t). Реализация может использовать любое представление для size_t, которое ей нравится, поэтому верхней границы размера нет, и реализация также может определять байт как 16-битный, и в этом случае size_t может быть эквивалентен беззнаковому символу.
Однако если отложить это в сторону, в целом у вас будет 32-битный размер size_t для 32-битных программ и 64-битный для 64-битных программ, независимо от модели данных. Обычно модель данных влияет только на статические данные; например, в GCC:
`-mcmodel=small'
Generate code for the small code model: the program and its
symbols must be linked in the lower 2 GB of the address space.
Pointers are 64 bits. Programs can be statically or dynamically
linked. This is the default code model.
`-mcmodel=kernel'
Generate code for the kernel code model. The kernel runs in the
negative 2 GB of the address space. This model has to be used for
Linux kernel code.
`-mcmodel=medium'
Generate code for the medium model: The program is linked in the
lower 2 GB of the address space but symbols can be located
anywhere in the address space. Programs can be statically or
dynamically linked, but building of shared libraries are not
supported with the medium model.
`-mcmodel=large'
Generate code for the large model: This model makes no assumptions
about addresses and sizes of sections.
Вы заметите, что указатели во всех случаях являются 64-битными; и в конце концов нет смысла иметь 64-битные указатели, но не 64-битные размеры.
person
bdonlan
schedule
28.05.2009