c++bit-manipulationbitsetstd-bitsethammingweight

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


Comparing the following two expressions

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

which one is better?


Solution

  • 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.