Прежде всего, если у вас есть такие типы, как uint16, где они определены? Они не являются стандартными типами, поэтому они будут определены в каком-то собственном заголовке - возможно, ваши или могут быть предоставлены какой-либо сторонней библиотекой; в этом случае вы должны спросить себя, насколько переносимым этот код, и создаете ли вы зависимость, которая может не иметь смысла в каком-либо другом приложении.
Другая проблема заключается в том, что многие библиотеки (с недобросовестной ИМО) определяют такие типы с различными именами, такими как UINT16, uint16, U16 UI16 и т. Д., Что он становится скорее кошмаром, гарантирующим соглашение о типе и избегающим конфликтов имен. Если такие имена определены в, они должны идеально размещаться в пространстве имен или иметь конкретный префикс библиотеки, чтобы указать, какую библиотеку они были определены для использования, например rtos::uint16
- rtos_uint16
.
Поскольку стандартная библиотека стандарта ISO C99 предоставляет стандартные типы длины бит в stdint.h, вы должны предпочесть их использование по сравнению с любыми, определенными в проприетарном или стороннем заголовке. Эти типы имеют суффикс _t
, например. uint16_t
. В C++ они могут быть помещены в пространство имен std::
(хотя это не задано, поскольку заголовок был введен в C99).
1] Какая польза от использования uint16, где uint32 также будет достаточным (если есть)?
Помимо моих предыдущих рекомендаций предпочесть stdint.h
«s uint16_t
, есть по крайней мере два законные причины для использования определенных длиной типов:
- Чтобы соответствовать конкретной ширине аппаратного регистра.
- Использовать общий и совместимый API для разных архитектур.
2] Будет ли какой-либо экономии в использовании памяти при использовании более коротких типов данных (с учетом выравнивания данных)?
Возможно, но если память не является вашей проблемой, это не является веской причиной для их использования. Стоит рассмотреть, возможно, для больших объектов данных или массивов, но применение в глобальном масштабе редко стоит усилий.
3] Если это необходимо для сохранения нескольких байтов памяти, нужно ли это сделать что-то разумное в современном оборудовании?
См. [2]. «Современное оборудование« однако не обязательно подразумевает большие ресурсы; существует множество 32-битных устройств ARM Cortex-M с использованием всего лишь нескольких Кбайт ОЗУ. Это больше касается экономии пространства, затрат и энергопотребления, чем в плане дизайна или архитектуры.
Это зависит от того, что вы делаете с данными? Если ваше приложение сильно общается? Если вы общаетесь с текстовыми или бинарными протоколами? Или вы пишете в/из аппаратных регистров? Также помните, что даже экономя только байт здесь и там, все это накапливается и может стать довольно большой экономией при подсчете. –
Согласитесь с @JoachimPileborg полностью зависит от данных. Если вы сохраняете 16 бит для каждого int, используя uint16 вместо uint32, вы вдвое сократите свои пакеты данных. Это, однако, зависит от архитектуры. Попытайтесь посмотреть, что произойдет. – mjshaw