int __builtin_popcount(unsigned int);
является встроенной функцией G CC, в то время как std::bitset<N>::count
является стандартом C ++.
Обе функции выполняют одно и то же: возвращают количество битов, которые установлены в true
.
Что вы должны использовать?
Всегда стремитесь использовать функции стандарта C ++, потому что другие компиляторы не поддерживают функцию __builtin_popcount
.
ОБНОВЛЕНИЕ
Если вы посмотрите на статистику, сделанную инструментом Google Benchmark:
#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);
с G CC 9.2 и флагами -std=c++2a -O3
, G CC Встроенная функция на 10% медленнее, чем функция std::bitset<N>::count()
, но, поскольку выход ASM одинаков для обеих функций, разница в тесте может быть вызвана другими факторами.