Я так запуталась size_t
. Я искал в Интернете и везде упоминал, что size_t
это беззнаковый тип, поэтому он может представлять только неотрицательные значения.
Мой первый вопрос: если он используется для представления только неотрицательных значений, почему бы нам не использовать unsigned int
вместо size_t
?
Мой второй вопрос заключается в следующем : size_t
и unsigned int
взаимозаменяемы или нет? Если нет, то почему?
И может ли кто-нибудь дать мне хороший пример size_t
и вкратце его работы?
typedef /*This part is implementation dependent */ size_t;
Ответы:
Потому что
unsigned int
это не только целое число без знака типа.size_t
может быть любой изunsigned char
,unsigned short
,unsigned int
,unsigned long
илиunsigned long long
, в зависимости от реализации.Они не взаимозаменяемы по причине, описанной выше
^^
.Я не совсем понимаю, что вы подразумеваете под «его кратковременной работой». Он работает как любой другой тип без знака (в частности, как тип, которому он присвоен). Рекомендуется использовать
size_t
при описании размера объекта. В частности,sizeof
оператор и различные стандартные библиотечные функции, такие какstrlen()
returnsize_t
.Бонус: вот хорошая статья о
size_t
(и тесно связанные сptrdiff_t
типом). Это очень хорошо объясняет, почему вы должны его использовать.источник
size_t
бытьunsigned char
? Это в стандарте, что это разрешено? Я имею в виду с этой идеей, как можно ожидать, что кто-то будет использоватьcalloc()
(и семью) иstrlen()
т. Д.? Мне это кажется абсурдным.size_t
в стандарте определен как «целочисленный тип без знака», но не требует, чтобы он был таким же, как любой изunsigned {char, short, int, long, long long}
.В C есть 5 стандартных целочисленных типов без знака:
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
с различными требованиями к их размерам и диапазонам (кратко, диапазон каждого типа является подмножеством диапазона следующего типа, но некоторые из них могут иметь тот же диапазон).
size_t
являетсяtypedef
(т. е. псевдонимом) для некоторого типа без знака (возможно, одного из вышеперечисленных, но возможно расширенного целочисленного типа без знака , хотя это маловероятно). Это тип, выдаваемыйsizeof
оператором.В одной системе может иметь смысл использовать
unsigned int
для представления размеров; с другой стороны, имеет смысл использоватьunsigned long
илиunsigned long long
. (size_t
Вряд ли будет либоunsigned char
илиunsigned short
, но это разрешено).Цель
size_t
состоит в том, чтобы избавить программиста от необходимости беспокоиться о том, какой из предопределенных типов используется для представления размеров.Код, который предполагает, что
sizeof
даетunsigned int
, не будет переносимым. Код, который предполагает, что он дает asize_t
, с большей вероятностью будет переносимым.источник
unsigned int
,unsigned long
и т. д.), которомуsize_t
соответствует, зависит от машины, на которой выполняется код? т.е. на одной архитектуре машины он соответствует,unsigned int
а на другой архитектуре будет соответствовать иunsigned long
т. д.?size_t
, особенно если, например,unsigned long
иunsigned long long
имеют одинаковый размер.long
, иlong long
т.д. действительно зависит от системы: Если вы посмотрите наlimits.h
вас, по крайней мере , под юниксами видны , что максимальное значение для Интс зависит от размера слова системы.size_t
имеет особое ограничение.Цитата из http://www.cplusplus.com/reference/cstring/size_t/ :
Он не является взаимозаменяемым,
unsigned int
поскольку размерint
определяется моделью данных. Например, LLP64 использует 32-битный,int
а ILP64 использует 64-битныйint
.источник
size_t используется для хранения размеров объектов данных и гарантированно может содержать размер любого объекта данных, который может создать конкретная реализация C. Этот тип данных может быть меньше (по количеству битов), больше или точно таким же, как unsigned int.
источник
Помимо других ответов, он также документирует код и сообщает людям, что вы говорите о размере объектов в памяти.
источник
apple
- яблоко , asize_t
- размер ...Тип size_t - это базовый беззнаковый целочисленный тип языка C / C ++. Это тип результата, возвращаемого оператором sizeof. Размер типа выбирается таким образом, чтобы он мог хранить максимальный размер теоретически возможного массива любого типа. В 32-битной системе size_t займет 32 бита, в 64-битной - 64 бита. Другими словами, переменная типа size_t может безопасно хранить указатель. Исключение составляют указатели на функции класса, но это особый случай. Хотя size_t может хранить указатель, для этой цели лучше использовать другой беззнаковый целочисленный тип uintptr_t (его имя отражает его возможности). Типы size_t и uintptr_t являются синонимами. Тип size_t обычно используется для счетчиков циклов, индексации массивов и адресной арифметики. Максимально возможное значение типа size_t - константа SIZE_MAX.
источник
size_t
может хранить размер любого отдельного объекта. Указатель может указывать на любой байт любого объекта. У вас может быть система, например, с 64-битным адресным пространством, которое ограничивает размер любого объекта 2 ** 32-1 байтами. Нет никакой гарантии, чтоsize_t
иuintptr_t
относятся к одному типу.Проще говоря, size_t зависит от платформы, а также от реализации, тогда как unsigned int зависит только от платформы.
источник