Я бачу змінні, визначені для цього типу, але я не знаю, звідки він походить, а також яке його призначення. Чому б не використовувати int або unsigned int? (Як щодо інших "подібних" типів? Void_t тощо).
Я бачу змінні, визначені для цього типу, але я не знаю, звідки він походить, а також яке його призначення. Чому б не використовувати int або unsigned int? (Як щодо інших "подібних" типів? Void_t тощо).
Відповіді:
stdlib.hІstddef.hзаголовки визначають тип даних з ім'ямsize_t1 , який використовується для позначення розміру об'єкта. Функції бібліотеки, які приймають розміри, очікують, що вони будуть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_ts. Якщо ви подивитеся на стандартні контейнери, ::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?", Просто тому, що це семантично значуще не робити. Існує практична причина того, що воно може бути, скажімо, typedefd як intі потім оновлене до більш longпізнього, без будь-кого, звичайно, змінювати свій код, але більш принципово, ніж цей тип повинен мати значення. Щоб значно спростити, змінна типу size_tпідходить і використовується для, що містить розміри речей, так само, як time_tце підходить для вмісту значень часу. Те, як вони реально реалізуються, має бути належним чином завданням впровадження. У порівнянні з тим, що просто називати все int, використання значущих імен шрифтів, як це допомагає з’ясувати значення та намір вашої програми, як і будь-який багатий набір типів.