MSVC相当于__builtin_popcount?

时间:2010-10-03 10:10:41

标签: visual-studio-2010 visual-c++ built-in

对于MSVC-10,GCC和Clang中的__builtin_popcount相当于什么?

3 个答案:

答案 0 :(得分:13)

使用提供的评论:

答案 1 :(得分:11)

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

#ifdef _MSC_VER
#  include <intrin.h>
#  define __builtin_popcount __popcnt
#endif

(来自Visual Studio 2008)。

答案 2 :(得分:3)

上面提到的__popcount内在函数不适用于ARM,甚至不适用于所有x86 CPU(它需要ABM指令集)。你不应该直接使用它;相反,如果您使用x86 / amd64,则应使用__cpuid内在函数在运行时确定处理器是否支持popcnt

请注意,您可能不想为每{{}}}次来电发出cpuid;你想把结果存储在某个地方。如果你的代码总是单线程的,那么这很简单,但是如果你必须是线程安全的,那么你必须使用One-Time Initialization这样的东西。但这只适用于Windows≥Vista;如果你需要使用旧版本,你需要自己动手(或使用第三方的东西)。

对于没有ABM的机器(或者如果运行时检测不值得),Bit Twiddling Hacks处有几个可移植版本(查找&#34;计数位设置&#34;)。我最喜欢的版本适用于最高128位的任何类型popcnt

T

如果你想要一个插入式版本,你可以使用the builtin module in portable-snippets(完全披露:portable-snippets是我的项目之一),这应该可以在任何地方使用。