В заголовке stdint.h
отсутствуют int_fastest_t
и uint_fastest_t
для соответствия типам {,u}int_fastX_t
. В тех случаях, когда ширина целочисленного типа не имеет значения, как выбрать целочисленный тип, который позволяет обрабатывать наибольшее количество бит с наименьшим штрафом за производительность? Например, если бы кто-то искал первый бит в буфере с использованием наивного подхода, можно было бы рассмотреть такой цикл:
// return the bit offset of the first 1 bit
size_t find_first_bit_set(void const *const buf)
{
uint_fastest_t const *p = buf; // use the fastest type for comparison to zero
for (; *p == 0; ++p); // inc p while no bits are set
// return offset of first bit set
return (p - buf) * sizeof(*p) * CHAR_BIT + ffsX(*p) - 1;
}
Естественно, использование char
приведет к большему количеству операций, чем int
. Но long long
может привести к более дорогостоящим операциям, чем накладные расходы на использование int
в 32-битной системе и т.д.
Мое нынешнее предположение относится к основным архитектурам, использование long
- это самая безопасная ставка: 32-битная 32-разрядная система и 64-разрядная на 64-разрядных системах.