std::bitset<N>::计数与 __builtin_popcount
std::bitset<N>::count vs __builtin_popcount
比较下面两个表达式
std::bitset<8>(5).count()
__builtin_popcount(5)
哪个更好?
int __builtin_popcount(unsigned int);
是 GCC 的内置函数,而 std::bitset<N>::count
是 C++ 标准。
两个函数做同样的事情:return 设置为 true
的位数。
你应该用什么?
总是倾向于使用 C++ 标准的函数,因为其他编译器不支持 __builtin_popcount
函数。
更新
如果您查看 Google 基准工具所做的统计数据:
#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);
使用 GCC 9.2 和标志 -std=c++2a -O3
,GCC 内置函数比 std::bitset<N>::count()
函数慢 10%,但是,由于两个函数的 ASM 输出相同,基准测试中的差异可能是因为其他因素。
根据 godbolt,bitset and popcount 在最新的 g++ 上产生相同的 asm 输出。但是,如评论中所述,__builtin_popcount
是 gcc 扩展,除 x86 外,其他编译器或其他体系结构均不可用。因此,bitset 选项显然更好。
当你不知道std::bitset<N>::count
中N的值时,我觉得第二个更好
更新:
你可以试试 std::popcount
比较下面两个表达式
std::bitset<8>(5).count()
__builtin_popcount(5)
哪个更好?
int __builtin_popcount(unsigned int);
是 GCC 的内置函数,而 std::bitset<N>::count
是 C++ 标准。
两个函数做同样的事情:return 设置为 true
的位数。
你应该用什么?
总是倾向于使用 C++ 标准的函数,因为其他编译器不支持 __builtin_popcount
函数。
更新
如果您查看 Google 基准工具所做的统计数据:
#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);
使用 GCC 9.2 和标志 -std=c++2a -O3
,GCC 内置函数比 std::bitset<N>::count()
函数慢 10%,但是,由于两个函数的 ASM 输出相同,基准测试中的差异可能是因为其他因素。
根据 godbolt,bitset and popcount 在最新的 g++ 上产生相同的 asm 输出。但是,如评论中所述,__builtin_popcount
是 gcc 扩展,除 x86 外,其他编译器或其他体系结构均不可用。因此,bitset 选项显然更好。
当你不知道std::bitset<N>::count
中N的值时,我觉得第二个更好
更新: 你可以试试 std::popcount