Visual studio 2010 MSVC相当于内置的popcount?

Visual studio 2010 MSVC相当于内置的popcount?,visual-studio-2010,visual-c++,built-in,Visual Studio 2010,Visual C++,Built In,对于MSVC-10,GCC和Clang中的等价物是什么?使用此代码片段,您可以在使用MSVC构建时获得GCC内置: #ifdef _MSC_VER # include <intrin.h> # define __builtin_popcount __popcnt #endif \ifdef\u MSC\u VER #包括 #定义内置的popcount popcnt #恩迪夫 (来自Visual Studio 2008)。使用提供的注释: 可通过 使用SSE4和 上面提到的\

对于MSVC-10,GCC和Clang中的等价物是什么?

使用此代码片段,您可以在使用MSVC构建时获得GCC内置:

#ifdef _MSC_VER
#  include <intrin.h>
#  define __builtin_popcount __popcnt
#endif
\ifdef\u MSC\u VER
#包括
#定义内置的popcount popcnt
#恩迪夫

(来自Visual Studio 2008)。

使用提供的注释:

  • 可通过
  • 使用SSE4和

上面提到的
\uuu popcount
内在功能无法在ARM上工作,甚至无法在所有x86 CPU上工作(它需要指令集)。你不应该直接使用它;相反,如果您使用的是x86/amd64,则应该在运行时使用
\uuuCPUID
内在函数来确定处理器是否支持
popcnt

请记住,您可能不想为每个
popcnt
调用发出
cpuid
;您需要将结果存储在某个地方。如果您的代码始终是单线程的,那么这很简单,但是如果您必须是线程安全的,那么您必须使用类似于。这只适用于Windows≥ 然而,维斯塔;如果您需要使用较旧的版本,您将需要推出自己的(或使用来自第三方的内容)

对于没有ABM的机器(或者如果运行时检测不值得的话),有几个可移植的版本(查找“计数位集”)。我最喜欢的版本适用于任何类型
T
最多128位:

v = v - ((v >> 1) & (T)~(T)0/3);                           // temp
v = (v & (T)~(T)0/15*3) + ((v >> 2) & (T)~(T)0/15*3);      // temp
v = (v + (v >> 4)) & (T)~(T)0/255*15;                      // temp
c = (T)(v * ((T)~(T)0/255)) >> (sizeof(T) - 1) * CHAR_BIT; // count

如果你想要一个可以使用的插入式版本(完全公开:可移植代码片段是我的项目之一),它几乎可以在任何地方工作。

看看内部语言(或),否则你可以随时使用链接中的内容:它是
\u MSC\u VER
而不是
\u MSC\u VER
,它实际上不是等效的。GCC中的函数是普通x86程序集,除非使用特定的指令集另行说明<代码>\uuuPOPCNT在MSVC中,是硬件指令popcnt的文本。注意这一点;它不适用于ARM CPU或不支持ABM指令集的x86 CPU。不需要对CPU检测产生兴趣。在启动任何线程之前执行此操作,例如使用
static const cpuid_result=cpuid()