C++ Boost库中动态位集的硬件支持的popcount
如何从C++ Boost库中动态位集的硬件支持的popcount,c++,boost,bit-manipulation,c++14,C++,Boost,Bit Manipulation,C++14,如何从Boost 1.64.0库中启用硬件支持的popcount对动态位集中的集位进行计数?显示了实现代码。我想你的问题的唯一答案是:交叉你的手指,为你的优化器祈祷 #include <boost/dynamic_bitset.hpp> #include <boost/function_output_iterator.hpp> #include <cstddef> std::size_t fn(boost::dynamic_bitset<> co
Boost 1.64.0
库中启用硬件支持的popcount
对动态位集中的集位进行计数?显示了实现代码。我想你的问题的唯一答案是:交叉你的手指,为你的优化器祈祷
#include <boost/dynamic_bitset.hpp>
#include <boost/function_output_iterator.hpp>
#include <cstddef>
std::size_t fn(boost::dynamic_bitset<> const & p)
{
std::size_t acc = 0;
boost::to_block_range(p, boost::make_function_output_iterator(
[&acc](boost::dynamic_bitset<>::block_type v)
{
acc += __builtin_popcountll(v);
}
));
return acc;
}
30: 48 8b 77 08 mov 0x8(%rdi),%rsi
34: 48 8b 17 mov (%rdi),%rdx
37: 48 89 f0 mov %rsi,%rax
3a: 48 29 d0 sub %rdx,%rax
3d: 48 83 f8 07 cmp $0x7,%rax
41: b8 00 00 00 00 mov $0x0,%eax
46: 7e 1d jle 65 <_Z3fn3RKN5boost14dynamic_bitsetImSaImEEE+0x35>
48: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
4f: 00
50: 31 c9 xor %ecx,%ecx
52: 48 83 c2 08 add $0x8,%rdx
56: f3 48 0f b8 4a f8 popcnt -0x8(%rdx),%rcx
5c: 48 01 c8 add %rcx,%rax
5f: 48 39 d6 cmp %rdx,%rsi
62: 75 ec jne 50 <_Z3fn3RKN5boost14dynamic_bitsetImSaImEEE+0x20>
64: c3 retq
65: c3 retq
66: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
6d: 00 00 00