Где я нахожу определение size_t? [дубликат]

Обычно это было бы, если В пункте не покроет слишком много таблицы, и затем это сделает сканирование таблицы. Лучший способ узнать в Вашем конкретном случае состоял бы в том, чтобы выполнить его в запросе анализатор и проверить план выполнения.

114
задан Eliseo Ocampos 13 July 2009 в 13:14
поделиться

6 ответов

Из Википедия

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

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

Из ] C99 7.17.1 / 2

Следующие типы и макросы определены в стандартном заголовке stddef.h

size_t

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

112
ответ дан 24 November 2019 в 02:35
поделиться

size_t - это целочисленный тип без знака результата sizeof оператор (ISO C99, раздел 7.17.)

Оператор sizeof возвращает размер (в байтах) его операнда, который может быть выражение или имя типа в скобках. Размер определяется от типа операнд. Результат - целое число. Значение результата определяется реализацией, и его тип (беззнаковый целочисленный тип) - size_t (ISO C99, раздел 6.5.3.4.)

25
ответ дан 24 November 2019 в 02:35
поделиться

Фактически size_t представляет количество байтов, которые вы можете адресовать. На большинстве современных архитектур за последние 10-15 лет это было 32 бита, что также было размером беззнакового int. Однако мы переходим к 64-битной адресации, в то время как uint , скорее всего, останется 32-битным (его размер не гарантируется стандартом C ++). Чтобы ваш код, зависящий от объема памяти, переносился между архитектурами, вы должны использовать size_t . Например, такие вещи, как размеры массивов, всегда должны использовать size_t . Если вы посмотрите на стандартные контейнеры, то :: size () всегда возвращает size_t .

Также обратите внимание, что в Visual Studio есть опция компиляции, которая может проверять эти типы ошибок называется "

4
ответ дан 24 November 2019 в 02:35
поделиться

Таким образом, вы всегда знаете, какой размер, потому что для размеров предназначен определенный тип. Собственный вопрос показывает, что это может быть проблемой: это int или unsigned int ? Кроме того, какова величина ( short , int , long и т. Д.)?

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

Фактическое определение можно найти в Справочной библиотеке C ++ , в которой говорится:

Тип: size_t (Unsigned интегральный тип)

Заголовок:

size_t соответствует интегральному типу данных, возвращаемому оператором языка sizeof , и определен в

2
ответ дан 24 November 2019 в 02:35
поделиться

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

2
ответ дан 24 November 2019 в 02:35
поделиться

Я не знаком с void_t , за исключением результатов поиска Google (он используется в библиотеке vmalloc от Kiem- Фонг Во из AT&T Research - я уверен, что он используется и в других библиотеках).

Различные определения типов xxx_t используются для абстрагирования типа от конкретной конкретной реализации, поскольку конкретные типы, используемые для определенных вещей, могут отличаются от одной платформы к другой. Например:

  • size_t абстрагирует тип, используемый для хранения размера объектов, потому что в некоторых системах это будет 32-битное значение, в других - 16-битное или 64-битное.
  • Void_t абстрагирует тип указателя, возвращаемого подпрограммами библиотеки vmalloc , потому что он был написан для работы в системах, предшествующих ANSI / ISO C, где ключевое слово void может не существовать. По крайней мере, я так думаю.
  • wchar_t абстрагирует тип, используемый для широких символов, поскольку в некоторых системах это будет 16-битный тип, в других - 32-битный тип.

Итак, если вы пишете свой код обработки широких символов, чтобы использовать тип wchar_t вместо, скажем, unsigned short , этот код, вероятно, будет более переносимым на различные платформы.

1
ответ дан 24 November 2019 в 02:35
поделиться