5

`unsigned int` против `size_t`: когда и что использовать?

14

Я заметил, что в современном C и C++ коде вместо int и unsigned int почти повсеместно используется size_t - от параметров для функций работы с C-строками до STL. МнеCurious, почему так происходит и какие преимущества это дает.

4 ответ(ов)

0

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

Например, на 64-битных системах int и unsigned int могут быть шириной 32 бита, но size_t должен быть достаточно большим, чтобы хранить значения, превышающие 4 ГБ.

0

Тип size_t — это тип, возвращаемый оператором sizeof. Он представляет собой беззнаковое целое число, способное выразить размер в байтах любой области памяти, поддерживаемой на данной машине. Обычно он связан с типом ptrdiff_t, так как ptrdiff_t является знаковым целым числом, для которого выполняется равенство sizeof(ptrdiff_t) и sizeof(size_t).

При написании кода на C вы всегда должны использовать size_t, когда имеете дело с диапазонами памяти.

С другой стороны, тип int по сути определяется как размер (знакового) целого числа, который хост-машина может использовать для наиболее эффективного выполнения арифметических операций с целыми числами. Например, на многих старых ПК значение sizeof(size_t) может составлять 4 байта, в то время как sizeof(int) составляет 2 байта. Арифметика с 16-битными числами была быстрее, чем с 32-битными, хотя процессор мог обрабатывать (логическое) адресное пространство размером до 4 ГиБ.

Используйте тип int только тогда, когда вам важна эффективность, так как его фактическая точность сильно зависит как от параметров компилятора, так и от архитектуры машины. В частности, стандарт C определяет следующие инварианты: sizeof(char) ⇐ sizeof(short) ⇐ sizeof(int) ⇐ sizeof(long), при этом не устанавливаются другие ограничения на фактическое представление точности, доступной программисту для каждого из этих примитивных типов.

Примечание: Это не то же самое, что в Java, где на самом деле задается битовая точность для каждого из типов 'char', 'byte', 'short', 'int' и 'long'.

0

Этот фрагмент из мануала по glibc 0.02 может быть полезен при исследовании данной темы:

Существует потенциальная проблема с типом size_t и версиями GCC до релиза 2.4. ANSI C требует, чтобы size_t всегда был беззнаковым типом. Для обеспечения совместимости с заголовочными файлами существующих систем GCC определяет size_t в stddef.h как тот тип, который определяет sys/types.h данной системы. Большинство Unix-систем, которые определяют size_t в sys/types.h, определяют его как знаковый тип. Некоторые части кода в библиотеке зависят от того, что size_t является беззнаковым типом, и не будут работать корректно, если он является знаковым.

Код GNU C библиотеки, который ожидает, что size_t будет беззнаковым, является правильным. Определение size_t как знакового типа неверно. Мы планируем, что в версии 2.4 GCC всегда будет определять size_t как беззнаковый тип, и скрипт fixincludes будет адаптировать sys/types.h системы, чтобы избежать конфликтов с этим.

Тем временем мы обходим эту проблему, явно указывая GCC использовать беззнаковый тип для size_t при компиляции GNU C библиотеки. Скрипт configure автоматически обнаружит, какой тип использует GCC для size_t, и организует переопределение, если это необходимо.

0

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

Если ваш компилятор настроен на 32-битную сборку, то size_t будет являться типом unsigned int (беззнаковое целое число). В этом случае максимальный размер, который вы можете хранить в переменной типа size_t, будет ограничен 4 ГБ.

Если же компилятор настроен на 64-битную сборку, то size_t будет определён как unsigned long long (беззнаковое длинное целое число). Это позволит вам работать с значительно большими размерами, достигая теоретического предела в 16 ЭБ (эксабайтов).

Таким образом, size_t адаптируется к архитектуре, на которой работает ваш код, обеспечивая правильное управление памятью в зависимости от разрядности.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь