size_t определяется стандартом C как возвращаемый тип целого числа без знака для оператора sizeof (C99 6.3.5.4.4) и аргумент malloc и friends (C99 7.20.3.3 и т. Д.). Фактический диапазон устанавливается так, чтобы максимум (SIZE_MAX) был не менее 65535 (C99 7.18.3.2).
Однако это не позволяет нам определить sizeof (size_t). Реализация может свободно использовать любое представление, которое ей нравится, для size_t - так что нет верхней границы для размера - и реализация также может свободно определять байт как 16-битный, и в этом случае size_t может быть эквивалентен unsigned char.
Однако, если оставить это в стороне, в целом у вас будет 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-битные размеры.