Comparing the following two expressions
std::bitset<8>(5).count()
__builtin_popcount(5)
which one is better?
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With