我想在我的程序中使用gcc builtin __builtin_popcount(),当且仅当程序使用-mpopcnt选项编译时。
这是因为我看到当程序而不是使用选项-mpopcnt编译时调用__builtin_popcount()实际上比自己执行popcnt()计算要慢。
所以我希望有一种方法可以测试预处理器中是否存在编译选项。有人知道答案吗?
答案 0 :(得分:2)
osmith@osmith-VirtualBox:~$ diff <(g++ -E -dM test.cpp) <(g++ -E -dM -mpopcnt test.cpp)
39a40
> #define __POPCNT__ 1
osmith@osmith-VirtualBox:~$ g++ --version
g++ (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413
当指定了-mpopcnt时,Clang还定义了__POPCNT__
。
osmith@WOTSIT:~$ diff <(clang++ -E -dM test.cpp) <(clang++ -E -dM -mpopcnt test.cpp)
157a158
> #define __POPCNT__ 1
osmith@WOTSIT:~$ clang++ --version
Ubuntu clang version 3.6.0-2ubuntu1~trusty1 (tags/RELEASE_360/final) (based on LLVM 3.6.0)
答案 1 :(得分:0)
虽然可以检查编译器特定的定义,如&#34; __ POPCNT __&#34;正如@kfsone所提到的,如果你在makefile中预测这个代码会更容易(这可能是编译器特定的/依赖的)你使用&#34; -mpopcnt&#34;作为编译选项的一部分。
例如: - (在makefile中)
USE_POP_CNT=y
ifeq ($(USE_POP_CNT), y)
g++ -mpopcnt -DUSE_POP_CNT=1 test.cpp
else
g++ test.cpp
endif
现在,您可以在代码中执行以下操作:
int bitcount;
#ifdef USE_POP_CNT
bitcount = __builtin_popcount(n);
#else // USE_POP_CNT
bitcount = my_popcount(n);
#endif