Как заголовок: size_t всегда без знака, т.е. для size_t x
, x
всегда >= 0
?
Size_t всегда без знака?
Ответ 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 пусто.