Comparing the following two expressions
std::bitset<8>(5).count()
__builtin_popcount(5)
which one is better?
Comparing the following two expressions
std::bitset<8>(5).count()
__builtin_popcount(5)
which one is 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.
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.
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