c++ - 使用 C++20 的 std::popcount 和 vector 优化是否等同于 popcnt 内在?

标签 c++ language-lawyer c++20 intrinsics avx2

C++20 引入了许多新函数,例如 std::popcount ,我使用相同的功能使用 Intel Intrinsic .

我编译了两个选项 - 可以在 Compiler Explorer code 中看到:

  1. 使用 Intel 的 AVX2 intrinsic
  2. 使用 std::popcount 和 GCC 编译器标志“-mavx2”

除了 std 模板中使用的类型检查之外,生成的汇编代码看起来是一样的。

就与操作系统无关的代码和具有相同的优化而言 - 假设使用 std::popcount 和 apt 编译器 vector 优化标志比直接使用内部函数更好是正确的吗?

谢谢。

最佳答案

技术上不。(但实际上,是的)。 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;

Constraints: T is an unsigned integer type ([basic.fundamental]).
Returns: The number of 1 bits in the value of x.

现实吗?编译器编写者非常聪明,会对其进行优化以尽可能多地使用内部函数。例如,gcc's implementation似乎经过了相当程度的优化。

关于c++ - 使用 C++20 的 std::popcount 和 vector 优化是否等同于 popcnt 内在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65580986/

相关文章:

c++ - 在 C++17 中调用对象生命周期之外的非静态成员函数

c++ - 具有自动说明符和static_cast的基于范围的for循环

C++ 如何使用views::split 打印单词?

c++ - 为什么 std::derived_from 概念是通过添加 cv 限定符的附加可转换性测试来实现的?

c++ - node.js/[my own library/plugin] 如何在 v8 上运行?

c++ - clang vs gcc - 从模板参数派生的结构的 CTAD

c++ - 持有派生类引用的基类的 std::unique_ptr 在 gcc 编译器中不显示警告,而裸指针显示它。为什么?

Java静态 block 引用另一个类中的静态变量

C++连接字符串问题

c++ - 这两个C++语句串联一个字符串有什么区别?