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