std :: bitset <N>:: count vs __builtin_popcount - PullRequest
0 голосов
/ 11 февраля 2020

Сравнение следующих двух выражений

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

какое из них лучше?

Ответы [ 2 ]

5 голосов
/ 11 февраля 2020

Согласно Godbolt, bitset и popcount дают точно такой же вывод, как на последнем g ++. Однако, как упоминалось в комментариях, __builtin_popcount является расширением g cc и не будет доступно ни на других компиляторах, ни на других архитектурах, кроме x86. Поэтому вариант с битрейтом явно лучше.

3 голосов
/ 11 февраля 2020
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 одинаков для обеих функций, разница в тесте может быть вызвана другими факторами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...