Size_t всегда без знака?

Как заголовок: size_t всегда без знака, т.е. для size_t x, x всегда >= 0?

Ответ 1

Да. Обычно он определяется как нечто вроде следующего (в 32-битных системах):

typedef unsigned int size_t;

Ссылка:

Стандартная секция С++ стандарта С++ size_t находится в <cstddef>, которая описана в стандарте C как <stddef.h>.
C Стандартная секция 4.1.5 определяет size_t как неподписанный интегральный тип результата оператора sizeof

Ответ 2

Согласно стандарту ISO 1999 C (C99), size_t представляет собой целочисленный тип без знака не менее 16 бит (см. разделы 7.17 и 7.18.3).

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

В стандарте ANSI C 1989 года (ANSI C) не упоминается минимальный размер или рекомендуемый ранг конверсии.

Стандарт ISO С++ 1998 (С++ 98) (а также текущий проект для С++ 0x) относится к стандарту C. Раздел 18.1 гласит:

Содержимое совпадает с заголовком библиотеки стандартного C <stddef.h> [...]

Согласно разделу 1.2, это означает библиотеку, определенную стандартом ISO C 1990 года (C90), включая ее первую поправку от 1995 года (C95):

Библиотека, описанная в пункте 7 ISO/IEC 9899: 1990 и пункт 7 ISO/IEC 9899/Amd.1:1995 в дальнейшем называется стандартной библиотекой C.

Части, относящиеся к size_t, должны быть унаследованы от ANSI C: Frontmatter и нумерация разделов, стандарты для C90 и ANSI C идентичны. Мне нужна копия нормативной поправки, чтобы быть уверенным, что никаких изменений в stddef.h не было, но я сомневаюсь. Минимальный размер представляется с помощью stdint.h, т.е. C99.

Также рассмотрим следующую цитату из раздела 1.2 на С++ 98:

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

Ответ 3

Да, size_t гарантированно будет неподписанным.

Ответ 4

В соответствии со стандартом он неподписан, однако я помню, что в некоторых старых реализациях использовался тип подписи для typedef.

Из более старого документа GCC:

Существует потенциальная проблема с типом 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, являющегося неподписанным типом, и не будет работать корректно, если он подписан

Я не уверен, насколько важно было бы защититься от этого. Мой код предполагает, что он без знака.

Ответ 5

Размер_t должен соответствовать тому же определению, что и стандарт C, а в нескольких местах в стандарте С++ подразумевается его неподписанная natura (особенно в определениях аргументов шаблона распределителя).

В стандарте С++, раздел 18.1 (ISO/IEC 14882 - первый выпуск 1998-01-01):

Таблица 15 перечисляет как определенные типы: ptrdiff_t и size_t

3 Содержимое совпадает с заголовком библиотеки Standard C со следующими изменениями: 4 Макрос NULL представляет собой константу нулевого указателя С++, определенную реализацией, в этом Международном стандарте (4.10).

Смещение макроса допускает ограниченный набор аргументов типа в этом Международном стандарте. тип должна быть структурой POD или объединением POD (пункт 9). Результат применения макроса offsetof к полю, которое является статическим элементом данных или членом функции undefined. СМ. ТАКЖЕ: подпункт 5.3.3, размер, подпункт 5.7, аддитивные операторы, подраздел 12.5, свободный магазин и ISO C подпункт 7.1.6.

Ответ 6

О, это просто ужасно:

vector<MyObject> arr;
Fill(arr);
size_t size = arr.size();
for(size_t i = 1; i < size - 1; ++i)
{
  auto obj = arr[i];
  auto next = arr[i+1];
}

Теперь рассмотрим вариант использования, где arr пусто.