Я бачу змінні, визначені для цього типу, але я не знаю, звідки він походить, а також яке його призначення. Чому б не використовувати int або unsigned int? (Як щодо інших "подібних" типів? Void_t тощо).
Я бачу змінні, визначені для цього типу, але я не знаю, звідки він походить, а також яке його призначення. Чому б не використовувати int або unsigned int? (Як щодо інших "подібних" типів? Void_t тощо).
Відповіді:
stdlib.h
Іstddef.h
заголовки визначають тип даних з ім'ямsize_t
1 , який використовується для позначення розміру об'єкта. Функції бібліотеки, які приймають розміри, очікують, що вони будутьsize_t
типовими, і розмір оператора оцінюєsize_t
.Фактичний тип
size_t
платформи залежить; загальна помилка полягає в тому, щоб вважати ,size_t
такими ж , як беззнаковий Int, що може привести до помилок програмування, 2 в зокрема , в вигляді 64-розрядні архітектури стають все більш поширеною.
Від C99 7.17.1 / 2
Наступні типи та макроси визначені у стандартному заголовку
stddef.h
<snip>
size_t
який є непідписаним цілим типом результату оператора sizeof оператора
int
а unsigned int
типи - 32 біти, тоді як size_t - 64 біт.
Відповідно до опису size_t на сайті en.cppreference.com size_t
визначено у наступних заголовках:
std::size_t
...
Defined in header <cstddef>
Defined in header <cstdio>
Defined in header <cstring>
Defined in header <ctime>
Defined in header <cwchar>
size_t
- це цілочислений неподписаний результат результату оператора sizeof (ISO C99, Розділ 7.17.)
sizeof
Оператор дає розмір (в байтах) свого операнда, який може бути вираз в дужках або ім'я типу. Розмір визначається від типу операнду. Результат - ціле число. Значення результату визначено реалізацією, а його тип (непідписаний цілочисельний тип) size_t
(ISO C99, розділ 6.5.3.4.)
Практично кажучи, size_t
це кількість байтів, на які можна звернутися. У більшості сучасних архітектур за останні 10-15 років було 32 біти, що також було розміром неподписаного int. Однак ми переходимо до 64-бітової адреси, в той час як uint
, швидше за все, розміщення буде на 32 бітах (розмір не гарантується в стандарті c ++). Щоб зробити свій код, який залежить від розміру пам'яті, переносним для всіх архітектур, ви повинні використовувати size_t
. Наприклад, такі речі, як розміри масиву, завжди повинні використовувати size_t
s. Якщо ви подивитеся на стандартні контейнери, ::size()
завжди повертається a size_t
.
Також зауважте, у візуальної студії є можливість компіляції, яка може перевірити наявність цих помилок під назвою "Виявити проблеми з 64-розрядною портативністю".
Таким чином, ви завжди знаєте, що таке розмір, адже конкретний тип присвячений розмірам. Саме власне запитання показує, що це може бути проблемою: це int
чи це unsigned int
? Крім того , що величина ( short
, int
, long
і т.д.)?
Оскільки призначено певний тип, вам не доведеться турбуватися про довжину чи підпис.
Дійсне визначення можна знайти в довідковій бібліотеці C ++ , де сказано:
Тип:
size_t
(Непідписаний інтегральний тип)Заголовок:
<cstring>
size_t
відповідає інтегральному типу даних, що повертається оператором мовиsizeof
і визначається у<cstring>
файлі заголовка (серед інших) як непідписаний інтегральний тип.В
<cstring>
, він використовується як тип параметраnum
у функціїmemchr
,memcmp
,memcpy
,memmove
,memset
,strncat
,strncmp
,strncpy
іstrxfrm
, що у всіх випадках використовується , щоб вказати максимальну кількість байтів або символів , функція повинна впливати.Він також використовується в якості повертається типу для
strcspn
,strlen
,strspn
іstrxfrm
до розмірів повернення і довжини.
size_t має бути визначено у заголовках вашої стандартної бібліотеки. На мій досвід, це, як правило, просто typedef для непідписаного int. Сенс у тому, що цього не повинно бути. Такі типи, як size_t, дозволяють звичайному постачальнику бібліотеки змінювати свої базові типи даних, якщо це підходить для платформи. Якщо ви вважаєте, що size_t завжди не підписаний int (через кастинг тощо), у майбутньому ви можете зіткнутися з проблемами, якщо ваш постачальник змінить size_t на 64-бітний тип. З цієї причини небезпечно припускати щось про цей чи будь-який інший тип бібліотеки.
Я не знайомий з , void_t
крім як в результаті пошуку Google (він використовується в вигляді vmalloc
бібліотеки по Кию-Фонг Vo в AT & T Research - Я впевнений , що він використовується в інших бібліотеках, а).
Різні типи xxx_t використовуються для абстрагування типу з певної певної реалізації, оскільки конкретні типи, які використовуються для певних речей, можуть відрізнятися від однієї платформи до іншої. Наприклад:
Void_t
абстрагує тип покажчика, який повертається vmalloc
підпрограми бібліотеки, оскільки він був написаний для роботи в системах, які датували ANSI / ISO C, де void
ключове слово може не існувати. Принаймні, це я здогадуюсь.wchar_t
абстрагує тип, що використовується для широких символів, оскільки в деяких системах це буде 16-ти бітний тип, в інших - 32-бітний тип.Тож якщо ви пишете свій широкий код обробки символів для використання wchar_t
типу замість, скажімо unsigned short
, цей код, ймовірно, буде більш портативним для різних платформ.
У мінімалістичних програмах, де size_t
визначення не завантажувалося "випадково", у деяких включаються, але мені все одно це потрібно в якомусь контексті (наприклад, для доступу std::vector<double>
), тоді я використовую цей контекст для отримання потрібного типу. Наприклад typedef std::vector<double>::size_type size_t
.
(При namespace {...}
необхідності оточуйте їх, щоб обмежити область застосування.)
Що стосується "Чому б не використовувати int або unsigned int?", Просто тому, що це семантично значуще не робити. Існує практична причина того, що воно може бути, скажімо, typedef
d як int
і потім оновлене до більш long
пізнього, без будь-кого, звичайно, змінювати свій код, але більш принципово, ніж цей тип повинен мати значення. Щоб значно спростити, змінна типу size_t
підходить і використовується для, що містить розміри речей, так само, як time_t
це підходить для вмісту значень часу. Те, як вони реально реалізуються, має бути належним чином завданням впровадження. У порівнянні з тим, що просто називати все int
, використання значущих імен шрифтів, як це допомагає з’ясувати значення та намір вашої програми, як і будь-який багатий набір типів.