В заголовке 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-битной системе и т. Д.
Мое текущее предположение - для основных архитектур, использование of long
- самая безопасная ставка: это 32-битная версия в 32-битных системах и 64-битная в 64-битных системах.