Теорія виглядає приблизно так:
uint8_t
має бути рівно 8 біт, але не потрібно існувати. Отже, ви повинні використовувати його там, де ви покладаєтесь на поведінку присвоєння modulo-256 * 8-бітового цілого числа, і де ви віддаєте перевагу помилці компіляції та неправильній поведінці на незрозумілих архітектурах.
uint_least8_t
має бути найменшим доступним цілим числом без підпису, який може зберігати принаймні 8 бітів. Ви можете використовувати його, коли хочете мінімізувати використання пам’яті таких речей, як великі масиви.
uint_fast8_t
передбачається, що це "найшвидший" тип без підпису, який може зберігати щонайменше 8 біт; однак насправді це не гарантовано буде найшвидшим для будь-якої даної операції на будь-якому даному процесорі. Ви могли б використовувати його для обробки коду, який виконує багато операцій зі значенням.
Практика полягає в тому, що типи "швидкий" і "найменший" використовуються мало.
Типи "найменш" дійсно корисні лише в тому випадку, якщо ви дбаєте про переносимість затемнених архітектур із CHAR_BIT! = 8, чого більшість людей не робить.
Проблема "швидких" типів полягає в тому, що "найшвидший" важко визначити. Менший тип може означати менше навантаження на систему пам'яті / кеш-пам’яті, але використання типу, який менший за власний, може вимагати додаткових інструкцій. Крім того, що найкраще може змінюватися між версіями архітектури, але реалізатори часто хочуть уникнути злому ABI в таких випадках.
З огляду на деякі популярні реалізації здається, що визначення uint_fastn_t є досить довільним. glibc, схоже, визначає їх як принаймні "розмір рідного слова" розглянутої системи, не беручи до уваги той факт, що багато сучасних процесорів (особливо 64-розрядних) мають специфічну підтримку швидких операцій над елементами, меншими за рідне слово розмір. IOS, очевидно, визначає їх як еквівалентні типам фіксованого розміру. Інші платформи можуть відрізнятися.
Загалом, якщо вашою метою є виконання жорсткого коду з крихітними цілими числами, вам слід порівнювати свій код на платформах, які вам важливі, різними розмірами, щоб побачити, що найкраще працює.
* Зверніть увагу, що, на жаль, поведінка присвоєння modulo-256 не завжди передбачає арифметику modulo-256, завдяки неправильній характеристиці просування C цілого числа.
uint8_t
гарантовано 8 біт,uint_fast8_t
гарантовано буде> = 8 біт, приблизно якunsigned char
.