std::bitset<N>::count vs __builtin_popcount

7k views Asked by At

Comparing the following two expressions

std::bitset<8>(5).count()
__builtin_popcount(5)

which one is better?

3

There are 3 answers

7
NutCracker On BEST ANSWER
int  __builtin_popcount(unsigned int);

is a built in function of GCC while std::bitset<N>::count is a C++ standard.

Both function do the same thing: return the number of bits that are set to true.

What should you use?

Always tend to use C++ standard's functions because other compilers don't support __builtin_popcount function.

UPDATE

If you take a look at the statistics made by Google Benchmark tool:

#include <bitset>

static void GccBuiltInPopCount(benchmark::State& state) {
    for (auto _ : state) {
        __builtin_popcount(5);
    }
}

BENCHMARK(GccBuiltInPopCount);

static void StdBitsetCount(benchmark::State& state) {
    for (auto _ : state) {
        std::bitset<8>(5).count();
    }
}

BENCHMARK(StdBitsetCount);

with GCC 9.2 and flags -std=c++2a -O3, GCC built in function is 10% slower than the std::bitset<N>::count() function but, since the ASM output is the same for both function, the difference in benchmark could be due to other factors.

2
Denis Sheremet On

According to godbolt, bitset and popcount yields just the same asm output on latest g++. However, as mentioned in the comments, __builtin_popcount is an gcc extension and won't be available on neither other compilers nor other architectures than x86. Therefore, bitset option is clearly better.

1
Kargath On

When you don’t know the value of N in std::bitset<N>::count, I think the second one is better

update: you can try std::popcount