Nikolai Shalakin Nikolai Shalakin - 1 month ago 15
C++ Question

C++ enum flags vs bitset

What are pros/cons of usage bitsets over enum flags?

namespace Flag {
enum State {
Read = 1 << 0,
Write = 1 << 1,
Binary = 1 << 2,
};
}

namespace Plain {
enum State {
Read,
Write,
Binary,
Count
};
}

int main()
{
{
unsigned int state = Flag::Read | Flag::Binary;
std::cout << state << std::endl;

state |= Flag::Write;
state &= ~(Flag::Read | Flag::Binary);
std::cout << state << std::endl;
} {
std::bitset<Plain::Count> state;
state.set(Plain::Read);
state.set(Plain::Binary);
std::cout << state.to_ulong() << std::endl;

state.flip();
std::cout << state.to_ulong() << std::endl;
}

return 0;
}


As I can see so far, bitsets have more convinient set/clear/flip functions to deal with, but enum-flags usage is a more wide-spreaded approach.

What are possible downsides of bitsets and what and when should I use in my daily code?

Answer Source

Do you compile with optimization on? It is very unlikely that there is a 24x speed factor.

To me, bitset is superior, because it manages space for you:

  • can be extended as much as wanted. If you have a lot of flags, you may run out of space in the int/long long version.
  • may take less space, if you only use just several flags (it can fit in an unsigned char/unsigned short - I'm not sure that implementations apply this optimization, though)