MSVC等同于
对于MSVC-10,在GCC和Clang中找到的__builtin_popcount
相当于什么?
使用提供的评论:
__popcnt
可通过<intrin.h>
_mm_popcnt_u64
与SSE4和<nmmintrin.h>
通过这段代码,您可以在使用MSVC构建时获得GCC内置代码:
#ifdef _MSC_VER
# include <intrin.h>
# define __builtin_popcount __popcnt
#endif
(从Visual Studio 2008开始工作)。
上面提到的__popcount
内在函数不适用于ARM,甚至不适用于所有x86 CPU(它需要ABM指令集)。 你不应该直接使用它; 相反,如果您使用的是x86 / amd64,则应该使用__cpuid
内部函数在运行时确定处理器是否支持popcnt
。
请记住,你可能不想为每个popcnt
调用发出一个cpuid
; 你会想要在某处存储结果。 如果你的代码总是单线程的,这是微不足道的,但如果你必须是线程安全的,你将不得不使用类似于一次初始化的东西。 这只适用于Windows≥Vista,但是; 如果您需要使用旧版本,则需要推出自己的版本(或者使用第三方版本)。
对于没有ABM的机器(或者如果运行时检测不值得),在Bit Twiddling Hacks中有几个便携版本(查找“Counting bits set”)。 我最喜欢的版本适用于任何类型为128位的T
:
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
如果你想要一个嵌入式版本,你可以在可移植片段中使用内置模块(完全公开:可移植片段是我的项目之一),它应该在任何地方工作。
链接地址: http://www.djcxy.com/p/12591.html上一篇: MSVC equivalent to