Что такое sizeof (size_t) в 32-битных по сравнению с различными 64-битными моделями данных? - PullRequest
38 голосов
/ 28 мая 2009

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


Ссылки:

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

Ответы [ 4 ]

51 голосов
/ 28 мая 2009

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-битные размеры.

10 голосов
/ 28 мая 2009

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

4 голосов
/ 28 мая 2009

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

4 голосов
/ 28 мая 2009

РЕДАКТИРОВАТЬ: Спасибо за комментарии - я посмотрел его в C99 стандарт , который говорится в разделе 6.5.3.4:

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

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

предел size_t

SIZE_MAX 65535

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

...