Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Comparing the following two expressions

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

which one is better?

like image 914
Milo Lu Avatar asked Jun 09 '26 22:06

Milo Lu


2 Answers

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.

like image 174
Denis Sheremet Avatar answered Jun 12 '26 13:06

Denis Sheremet


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.

like image 33
NutCracker Avatar answered Jun 12 '26 11:06

NutCracker



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!