Вопрос

В нескольких примерах C++ я вижу использование типа size_t там, где я бы использовал простой int.В чем разница и почему size_t должен быть лучше?

Это было полезно?

Решение

От дружелюбная Википедия:

Файлы заголовков stdlib.h и stddef.h определяют тип данных, называемый size_t который используется для представления размера объекта.Библиотечные функции, которые принимают размеры, ожидают, что они будут иметь тип size_t, а оператор sizeof оценивает значение size_t.

Фактический тип size_t зависит от платформы;Распространенной ошибкой является предположение, что size_t — это то же самое, что unsigned int, что может привести к ошибкам программирования, особенно по мере того, как 64-битные архитектуры становятся все более распространенными.

Также проверьте Почему size_t имеет значение

Другие советы

size_t — это тип, используемый для представления размеров (как следует из его названия).Его платформа (и даже потенциально реализация) зависит от него, и его следует использовать только для этой цели.Очевидно, что size_t представляет размер без знака.Многие функции stdlib, включая malloc, sizeof и различные функции работы со строками, используют size_t в качестве типа данных.

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

Обобщить :используйте size_t для представления размера объекта и int (или long) в других случаях.

Это потому, что size_t может быть чем угодно, кроме int (возможно, структуры).Идея состоит в том, что он отделяет свою работу от базового типа.

А size_t тип определяется как беззнаковый целочисленный тип sizeof оператор.В реальном мире вы часто будете видеть int определяется как 32 бита (для обратной совместимости), но size_t определяется как 64 бита (поэтому вы можете объявлять массивы и структуры размером более 4 ГиБ) на 64-битных платформах.Если long int также является 64-битным, это называется соглашением LP64;если long int 32 бита, но long long int а указатели — 64 бита, это LLP64.Вы также можете получить обратную программу, которая использует 64-битные инструкции для скорости, но 32-битные указатели для экономии памяти.Также, int подписан и size_t не подписан.

Исторически существовал ряд других платформ, где адреса были шире или короче исходного размера. int.На самом деле, в 70-х и начале 80-х это было скорее обычным явлением, чем нет:все популярные 8-битные микрокомпьютеры имели 8-битные регистры и 16-битные адреса, а переход от 16 к 32 битам также привел к появлению множества машин, у которых адреса были шире, чем их регистры.Я иногда все еще вижу здесь вопросы о Borland Turbo C для MS-DOS, в котором в режиме огромной памяти 20-битные адреса хранились в 32 битах на 16-битном процессоре (но который мог поддерживать 32-битный набор команд 80386);Motorola 68000 имел 16-битное АЛУ с 32-битными регистрами и адресами;существовали мэйнфреймы IBM с 15-битными, 24-битными или 31-битными адресами.Вы также по-прежнему видите разные размеры ALU и адресной шины во встроенных системах.

В любой момент int меньше, чем size_t, и вы пытаетесь сохранить размер или смещение очень большого файла или объекта в unsigned int, существует вероятность того, что оно может переполниться и вызвать ошибку.С int, также существует возможность получить отрицательное число.Если int или unsigned int шире, программа будет работать правильно, но будет тратить память.

Обычно вам следует использовать правильный тип для этой цели, если вы хотите переносимости.Многие люди рекомендуют вам использовать знаковые математические вычисления вместо беззнаковых (чтобы избежать неприятных, тонких ошибок, таких как 1U < -3).Для этой цели стандартная библиотека определяет ptrdiff_t в <stddef.h> как знаковый тип результата вычитания указателя из другого.

Тем не менее, обходным путем может быть проверка границ всех адресов и смещений относительно INT_MAX и либо 0 или INT_MIN при необходимости и включите предупреждения компилятора о сравнении знаковых и беззнаковых величин на случай, если вы что-то пропустите.В любом случае вы всегда, всегда, всегда должны проверять доступ к массиву на предмет переполнения в C.

Определение SIZE_T находится по адресу:https://msdn.microsoft.com/en-us/library/cc441980.aspx и https://msdn.microsoft.com/en-us/library/cc230394.aspx

Вставляем сюда необходимую информацию:

SIZE_T это ULONG_PTR представляющее максимальное количество байтов, на которые может указывать указатель.

Этот тип объявляется следующим образом:

typedef ULONG_PTR SIZE_T;

А ULONG_PTR — это беззнаковый длинный тип, используемый для точности указателя.Он используется при приведении указателя к длинному типу для выполнения арифметических операций с указателями.

Этот тип объявляется следующим образом:

typedef unsigned __int3264 ULONG_PTR;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top