我正在尝试为 ORB 功能实现 C++17 可移植且高效的汉明距离函数,希望在为 x86 和 ARM 编译时自动使用 SIMD。
std::bitset
std::bitset<N>
提供了按位运算和计数的标准方式,并且它也优于__builtin_popcount
. cv::Mat
然而,它是一种拥有数据的容器类型,并且不容易从由 计算的存储的 256 位向量转换而来cv::ORB::detectAndCompute
。
该线程要求转换cv::Mat
为std::bitset<256>
. 我认为memcpy
它的答案不正确,因为我没有std::bitset
在https://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