2009-07-06 3 views
53

В качестве заголовка: является size_t всегда без знака, то есть для size_t x, является x всегда >= 0?is size_t всегда без знака?

+4

Некоторые цитаты из документа стандартов для всех утверждений ниже были бы хороши. – 2009-07-06 21:01:36

+4

Это не размер, как вы его используете :) – ralphtheninja

+8

Существует «ssize_t» для «подписанного size_t» :) –

ответ

44

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

typedef unsigned int size_t; 

Ссылка:

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

+0

@Neil: Я знаю. Это было первое, что я нашел. У меня нет стандарта C++ под рукой, поэтому я загружаю его (моя связь проклята медленно). Тем временем я ставил что-то другое, кроме меня. –

+0

Ну, у меня есть стандарт C++, но не могу найти его, возможно, потому, что он фактически определен в стандарте C (не C99). Я надеюсь, что кто-то отследит его, потому что я думаю, что это интересный вопрос! – 2009-07-06 21:12:42

+0

Имейте в виду, что cplusplus.com имеет некоторые странные сайты. Посмотрите на это, например: http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/, которые теперь являются интересными сигнатурами оператора <<: –

14

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

46

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

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

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

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

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

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

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

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

Также просьба рассмотреть следующую цитату из раздела 1.2 из C++ 98:

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

+0

К сожалению, вопрос касается не C99, а C++. – 2009-07-06 21:08:33

+8

@Neil, ну он должен взять C-стандарт, потому что C++ Standard делегирует ему :) Он сам не определяет size_t :) –

+2

Да, но стандарт C++ не ссылается на стандарт C99. – 2009-07-06 21:13:30

5

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

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

+0

Я думаю, что все знают, что это, вероятно, без знака - но если кто-то не может процитировать соответствующий документ стандартов, мы никогда не узнаем наверняка. – 2009-07-06 21:10:34

+0

У меня нет стандартного документа, доступного на данный момент (хотя я уверен, что все соответствующие стандарты C90, C99 и C++ 98 и выше требуют, чтобы он был без знака). Однако я просто хотел указать, что независимо от стандарта существуют потенциально важные исключения, когда size_t является подписанным типом. –

2

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

В стандарте C++, раздел 18.1 (ISO/IEC 14882 - Первое издание 1998-01-01):

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

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

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

1

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

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]; 
} 

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