小编fcc*_*fcc的帖子

是否有类似于 std::bitset 的非拥有引用来为其他容器中的数据提供按位操作和计数?

我正在尝试为 ORB 功能实现 C++17 可移植且高效的汉明距离函数,希望在为 x86 和 ARM 编译时自动使用 SIMD。

有问题std::bitset

std::bitset<N>提供了按位运算和计数的标准方式,并且它也优于__builtin_popcount. cv::Mat然而,它是一种拥有数据的容器类型,并且不容易从由 计算的存储的 256 位向量转换而来cv::ORB::detectAndCompute

该线程要求转换cv::Matstd::bitset<256>. 我认为memcpy它的答案不正确,因为我没有std::bitsethttps://en.cppreference.com/w/cpp/utility/bitset中找到内存布局。此外,std::bitset构造函数不支持初始化超过位sizeof(unsigned long long)

我的实施有问题

为了避免复制,我当前的实现使用类似 span 的类:

struct ORB_view {
  inline static constexpr int length = 256 / sizeof(uint32_t) / 8;
  const uint32_t* data;
};
Run Code Online (Sandbox Code Playgroud)

但是,这不能直接使用按位运算和 popcount,并且会导致在实现中出现显式的 SIMD 指令,我希望通过使用std::bitset<N>::count().

我的期望是什么

因此,在这种情况下,提供按位运算和计数的非拥有引用将非常有帮助。所需的功能是:

  • 没有数据副本,
  • 固定长度为std::bitset
  • 按位异或运算和 popcount
  • 没有针对 ARM …

c++ simd bitwise-operators std-bitset c++17

4
推荐指数
1
解决办法
107
查看次数

标签 统计

bitwise-operators ×1

c++ ×1

c++17 ×1

simd ×1

std-bitset ×1