Разница между размером t и std:: размер t

каковы различия между size_t и std::size_t С точки зрения того, где они объявлены, когда они должны быть использованы и любые другие отличительные особенности?

3 ответов


С size_t и C++'ы std::size_t а как же.

в C это определено в <stddef.h> и в C++, его определили в <cstddef> содержимое которого совпадает с заголовком C (см. цитату ниже). Его определяют как целочисленный тип без знака на результат на sizeof оператора.

стандарт C говорит в §17.7/2,

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

и стандарт C++ говорит (о cstddef заголовок) в §18.1/3,

содержимое совпадает со стандартным заголовком библиотеки C,со следующими изменениями.

так что да, одинаковы; единственная разница в том, что C++ определяет size_t на std пространство имен.

Пожалуйста, обратите внимание, что в приведенной выше строке также говорится "со следующими изменениями" что не относится к size_t. Это скорее относится к новым добавлениям (в основном), сделанным C++ в язык (не присутствует в C), которые также определены в том же заголовке.


Википедия имеет очень хорошую информацию о диапазоне и размере хранения size_t:

диапазон и размер хранилища size_t

The фактический тип size_t-это ; a распространенная ошибка предполагается, что size_t совпадает с unsigned int, который может привести к ошибки программирования,[3][4] при движении от 32 до 64-разрядной архитектуры, для образец.

согласно ISO c 1999 standard (C99), size_t является беззнаковым целочисленный тип не менее 16 бит.

а остальное вы можете узнать от на этой странице в Википедии.


Из C++03 "17.4.3.1.4 Типы":

для каждого типа T из стандартной библиотеки C (сноска 169) типы ::T и std::T зарезервированы для реализации и, когда они определены,:: T должны быть идентичны std::T.

и сноска 169:

эти типы clock_t данных div_t, файл, fpos_t, lconv, ldiv_t, mbstate_t, типы ptrdiff_t, sig_atomic_t, реализация, время, ТМ, va_list, wctrans_t, wctype_t, и wint_t.


std:: size_t на самом деле stddef.h ' s реализация.

cstddef дает следующее:

#include <stddef.h>
namespace std 
{
  using ::ptrdiff_t;
  using ::size_t;
}

...эффективное приведение предыдущего определения в пространство имен std.