问题描述
C++20 引入了许多新函数,例如 std::popcount
,我使用 Intel Intrinsic 使用相同的功能。
我编译了这两个选项 - 可以在 Compiler Explorer code 中看到:
- 使用英特尔的 AVX2 内在函数
- 使用 std::popcount 和 GCC 编译器标志“-mavx2”
看起来生成的汇编代码是一样的,除了 std 模板中使用的类型检查。
在与操作系统无关的代码方面并具有相同的优化 -
假设使用 std::popcount
和 apt 编译器向量优化标志比直接使用内在函数更好吗?
谢谢。
解决方法
技术上否。(但实际上,是的)。 C++ 标准只规定了popcount
的行为,而不是实现(参考[bit.count])。
实现者可以做任何他们想做的事情来实现这种行为,包括使用 popcnt
内在函数,但他们也可以编写一个 while 循环:
int set_bits = 0;
while(x)
{
if (x & 1)
++set_bits;
x >>= 1;
}
return set_bits;
这是 [bit.count] 标准中的完整措辞:
template<class T>
constexpr int popcount(T x) noexcept;
约束:T
是无符号整数类型([basic.fundamental])。
返回:1
的值中 x
位的数量。
现实吗?编译器编写者非常聪明,并且会对其进行优化以尽可能多地使用内在函数。例如,gcc's implementation 似乎得到了相当大的优化。