Является ли size_t размером слова?

Является size_t размер слова компьютера, который скомпилировал код?

Парсинг с g ++, мой взгляд компилятора size_t как long unsigned int, Компилятор внутренне выбирает размер size_tили size_t на самом деле напечатан внутри некоторого макроса препроцессора в stddef.h к размеру слова до вызова компилятора?

Или я совсем не в курсе?

30

Решение

В стандарте C ++ [support.types] (18.2) / 6: «Тип size_t является целочисленным целочисленным типом, определяемым реализацией, который является достаточно большим, чтобы содержать размер в байтах любого объекта. «

Это может или не может быть таким же, как «размер слова», что бы это ни значило.

21

Другие решения

Нет; 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, хотя это немного странно, что в обосновании этого не говорится.

12

Не обязательно. Спецификация C ISO (§17.1 / 2) определяет size_t как

size_t, который является целым типом без знака результата sizeof оператор

Другими словами, size_t должен быть достаточно большим, чтобы вместить размер любого выражения, которое может быть получено из sizeof, Это может быть размер машинного слова, но он может быть значительно меньше (если, например, компилятор ограничивал максимальный размер массивов или объектов) или значительно больше (если компилятор позволял вам создавать объекты настолько огромные, что один компьютер слово не может сохранить размер этого объекта).

Надеюсь это поможет!

3

size_t изначально был просто typedef в sys / types.h (традиционно в Unix / Linux). Предполагалось, что он «достаточно большой», скажем, для максимального размера файла или максимального выделения с помощью malloc. Однако со временем стандартные комитеты схватили его, и он оказался скопированным во множество различных заголовочных файлов, каждый раз защищаясь своей собственной защитой #ifdef от множественного определения. С другой стороны, появление 64-битных систем с очень большими потенциальными размерами файлов затуманило его роль. Так что это немного палимпсет.

Языковые стандарты теперь называют это жизнью в stddef.h. Это не имеет никакого отношения к размеру аппаратного слова и никакой магии компилятора. Посмотрите другие ответы относительно того, что эти стандарты говорят о том, насколько он велик.

2

Все такие определения определены реализацией. Я бы использовал sizeof (char *) или sizeof (void *), если бы мне нужен был лучший размер предположения. Лучшее, что это дает, — это видимый размер программного обеспечения, который используется … что аппаратное обеспечение действительно может отличаться (например, 32-разрядная система может поддерживать 64-разрядные целые числа программным обеспечением).

Также, если вы новичок в языках Си, смотрите stdint.h для всех видов материалов с целочисленными размерами.

0

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

Самый большой возможный объект — это массив (или структура) с размером, равным всему доступному адресному пространству. Невозможно сослаться на больше объект осмысленным образом, и кроме наличия пространства подкачки, нет никаких причин, по которым он должен быть каким-либо меньше.

Следовательно, согласно формулировке определения, size_t должен должно быть не менее 32 бит в 32-битной архитектуре и не менее 64 бит в 64-битной системе. Конечно, для реализации возможно выбрать больший size_t, но это обычно не так.

0
По вопросам рекламы [email protected]