Является size_t
размер слова компьютера, который скомпилировал код?
Парсинг с g ++, мой взгляд компилятора size_t
как long unsigned int
, Компилятор внутренне выбирает размер size_t
или size_t
на самом деле напечатан внутри некоторого макроса препроцессора в stddef.h
к размеру слова до вызова компилятора?
Или я совсем не в курсе?
В стандарте C ++ [support.types] (18.2) / 6: «Тип size_t
является целочисленным целочисленным типом, определяемым реализацией, который является достаточно большим, чтобы содержать размер в байтах любого объекта. «
Это может или не может быть таким же, как «размер слова», что бы это ни значило.
Нет; size_t
это не обязательно то, что вы подразумеваете под словом «размер слова» компьютера, на котором будет выполняться код (в случае кросс-компиляции) или который скомпилировал код (в обычном случае, когда код будет выполняться на компьютере того же типа) который скомпилировал код). Это целочисленный тип без знака, достаточно большой, чтобы содержать размер (в байтах) самого большого объекта, который может выделить реализация.
sizeof
а также size_t
Я не знаю когда size_t
был введен точно, но это было между 1979 и 1989 годами. 1-е издание K&R Язык программирования C 1978 года не упоминает size_t
, В Руководстве по программированию Unix 7-го издания не упоминается size_t
и это относится к 1979 году. В книге «Среда программирования UNIX», написанной Керниганом и Пайком в 1984 году, ничего не говорится о size_t
в индексе (ни из malloc()
или же free()
(к моему удивлению), но это только показательно, а не окончательно. Стандарт C89, безусловно, имеет size_t
,
Обоснование C99 документирует некоторую информацию о sizeof()
а также size_t
:
6.5.3.4 Размер оператора
Это важно для правильного использования таких функций, как
malloc
а такжеfread
тот
sizeof(char)
быть точно одним. На практике это означает, что байт в терминах C является наименьшим
единица хранения, даже если эта единица имеет ширину 36 бит; и все объекты состоят из целого числа
количество этих самых маленьких единиц. Также применяется, если память адресуется в битах.
С89, как К&R, определили результатsizeof
оператор быть константой целого типа без знака. Общие реализации и обычное использование часто предполагали, что
результирующий типint
, Старый код, который зависит от этого поведения, никогда не был переносимым на
реализации, которые определяют результат как тип, отличный отint
, Комитет C89 не сделал
чувствую, что было бы правильно сменить язык, чтобы защитить неверный код.Тип
sizeof
, что бы это ни было, публикуется (в заголовке библиотеки<stddef.h>
) как
size_t
, поскольку для программиста полезно иметь возможность ссылаться на этот тип. Это требование
неявно ограничиваетsize_t
быть синонимом существующего целого типа без знака. Обратите внимание также
что, хотяsize_t
это тип без знака,sizeof
не включает в себя какие-либо арифметические операции
или преобразования, которые привели бы к поведению модуля, если размер слишком велик для представления в виде
size_t
таким образом отменяя любое представление о том, что самый большой декларируемый объект может быть слишком большим, чтобы охватить дажеunsigned long
в C89 илиuintmax_t
в C99. Это также ограничивает
максимальное количество элементов, которые могут быть объявлены в массиве, так как для любого массиваa
изN
элементы,
N == sizeof(a)/sizeof(a[0])
таким образом
size_t
также является удобным типом для размеров массива и поэтому используется в нескольких библиотечных функциях. […]7.17 Общие определения
<stddef.h>
заголовок, разработанный для предоставления определений нескольких типов и макросов, широко используемых в сочетании с библиотекой:ptrdiff_t
,size_t
,wchar_t
, а такжеNULL
,
Включение любого заголовка, который ссылается на один из этих макросов, также определит его, исключение
обычное библиотечное правило, согласно которому каждый макрос или функция принадлежит только одному заголовку.
Обратите внимание, что это специально упоминает, что <stddef.h>
был изобретен комитетом C89. Я не нашел слов, которые говорят, что size_t
был также изобретен комитетом C89, но если это не так, это была кодификация довольно недавнего развития в C.
В комментарии к bmargulies ответ, vonbrand говорит, что ‘это [size_t
] это, конечно, ANSI-C-ism ‘. Я могу очень легко поверить, что это было новшеством с оригинальным ANSI (ISO) C, хотя это немного странно, что в обосновании этого не говорится.
Не обязательно. Спецификация C ISO (§17.1 / 2) определяет size_t
как
size_t, который является целым типом без знака результата
sizeof
оператор
Другими словами, size_t
должен быть достаточно большим, чтобы вместить размер любого выражения, которое может быть получено из sizeof
, Это может быть размер машинного слова, но он может быть значительно меньше (если, например, компилятор ограничивал максимальный размер массивов или объектов) или значительно больше (если компилятор позволял вам создавать объекты настолько огромные, что один компьютер слово не может сохранить размер этого объекта).
Надеюсь это поможет!
size_t изначально был просто typedef в sys / types.h (традиционно в Unix / Linux). Предполагалось, что он «достаточно большой», скажем, для максимального размера файла или максимального выделения с помощью malloc. Однако со временем стандартные комитеты схватили его, и он оказался скопированным во множество различных заголовочных файлов, каждый раз защищаясь своей собственной защитой #ifdef от множественного определения. С другой стороны, появление 64-битных систем с очень большими потенциальными размерами файлов затуманило его роль. Так что это немного палимпсет.
Языковые стандарты теперь называют это жизнью в stddef.h. Это не имеет никакого отношения к размеру аппаратного слова и никакой магии компилятора. Посмотрите другие ответы относительно того, что эти стандарты говорят о том, насколько он велик.
Все такие определения определены реализацией. Я бы использовал sizeof (char *) или sizeof (void *), если бы мне нужен был лучший размер предположения. Лучшее, что это дает, — это видимый размер программного обеспечения, который используется … что аппаратное обеспечение действительно может отличаться (например, 32-разрядная система может поддерживать 64-разрядные целые числа программным обеспечением).
Также, если вы новичок в языках Си, смотрите stdint.h для всех видов материалов с целочисленными размерами.
Хотя в определении прямо не указано, какой именно тип size_t
является, и даже не требует минимального размера, это косвенно дает хорошие советы. size_t
должен быть способен содержать размер в байтах любого объекта, другими словами, он должен иметь возможность содержать размер максимально возможного объекта.
Самый большой возможный объект — это массив (или структура) с размером, равным всему доступному адресному пространству. Невозможно сослаться на больше объект осмысленным образом, и кроме наличия пространства подкачки, нет никаких причин, по которым он должен быть каким-либо меньше.
Следовательно, согласно формулировке определения, size_t
должен должно быть не менее 32 бит в 32-битной архитектуре и не менее 64 бит в 64-битной системе. Конечно, для реализации возможно выбрать больший size_t
, но это обычно не так.