Для собственной реализации std::bitset
(std запрещено) я использовал uint_fast32_t
, поскольку он быстрее на 64-битных процессорах.Замечание было сделано для экономии места для небольших наборов, например, битовый набор <6> не должен использовать 8 байтов.Трата еще больше, если вы рассматриваете выравнивание в структуре.
Использовать C ++ 11 хорошо.Я хотел бы элегантно выбрать:
- Размер <= 8: uint8_t </li>
- Размер <= 16: uint16_t </li>
- Размер <= 32: uint32_t </li>
- Размер> 32: uint_fast32_t
в качестве типа хранилища в моем классе:
template<size_t Size>
struct BitSet {
typedef <expression> StorageType;
// an array of that storage type...
};
Я могу просто подумать о довольно неуклюжих вспомогательных шаблонах, но, возможно, есть что-то более элегантное вC ++ 11.
Редактировать: уточнить: uint_fast8_t
подойдет для исходного класса, компилятор может выбрать все, что быстро.Представьте себе размер == 1000000.Но на некоторых машинах он будет 64-битным, и когда размер имеет значение в некоторых случаях использования, например, размер == 4, это означает, что будет потрачено 7 байтов.