Какой sizeof (size_t) на 32-битных и разных 64-битных моделях данных?

В 64-битной системе sizeof(unsigned long) зависит от модели данных, реализованной системой, например, это 4 байта на LLP64 (Windows), 8 байт на LP64 (Linux и т.д.). Каким должен быть sizeof(size_t)? Это зависит от модели данных, например, sizeof(long)? Если да, то как?


Литература:

64-битные модели данных в Википедии

Ответ 1

size_t определяется стандартом C как неподписанный тип возвращаемого значения оператора sizeof (C99 6.3.5.4.4) и аргумент malloc и друзей (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-битные.

Ответ 2

он должен меняться в зависимости от архитектуры, поскольку он представляет собой размер любого объекта. Таким образом, 32-битная система size_t будет иметь ширину не менее 32 бит. В 64-битной системе она будет иметь ширину не менее 64 бит.

Ответ 3

EDIT: Спасибо за комментарии - я просмотрел его в C99 standard, который гласит в разделе 6.5.3.4:

Значение результата определяемый реализацией, и его тип (беззнаковый целочисленный тип) равен size_t, определенная в <stddef.h> (и других заголовки)

Таким образом, размер size_t не указан, только он должен быть целым числом без знака. Однако интересную спецификацию можно найти в главе 7.18.3 стандарта:

предел size_t

SIZE_MAX 65535

В основном это означает, что, независимо от размера size_t, допустимый диапазон значений составляет от 0-65535, остальное зависит от реализации.

Ответ 4

size_t обычно 64 бит на 64-битной машине