首先內建函式有的屬於預編譯,有的屬於執行過程的函式,這一點我現在還不是很清楚,待以後進一步詳細討論。
然後我們給出乙個長**,裡面包含了常用的c語言內建函式,參考文章見文末。
總覽:
#include #include /**
* 返回x中最後乙個為1的位是從後向前的第幾位
* 000101000 -> 4
* 8 -> 4
*/#define ffs(s) __builtin_ffs(s)
/** * x中1的個數
* */
#define popcount(s) __builtin_popcount(s)
/** * x末尾0的個數。x=0時結果未定義。
* x前導0的個數。x=0時結果未定義。
*/#define ctz(s) __builtin_ctz(s)
#define clz(s) __builtin_clz(s)
/** * x中1的奇偶性。
* 奇:1, 偶:0
*/#define parity(i) __builtin_parity(i)
/** * 當前函式的第n級呼叫者的位址,用的最多的就是__builtin_return_address(0),
* 即獲得當前函式的呼叫者的位址。
* 注意,該函式實現是體系結構相關的,有些體系結構只實現了n=0的返回結果。
*/#define return_addr(s) __builtin_return_address(s)
void test1_return_address()
void test2_return_address()
void test3_return_address()
/** * 按位元組翻轉x,返回翻轉後的結果。
* uint16_t __builtin_bswap16 (uint16_t x)
* uint32_t __builtin_bswap32 (uint32_t x)
*/#define swap16(i) __builtin_bswap16(i)
#define swap32(i) __builtin_bswap32(i)
/** * 它通過對資料手工預取的方法,在使用位址addr的值之前就將其放到cache中,
* 減少了讀取延遲,從而提高了效能,但該函式也需要 cpu 的支援。
* 該函式可接受三個引數,
* 第乙個引數addr是要預取的資料的位址,
* 第二個引數可設定為0或1(1表示我對位址addr要進行寫操作,0表示要進行讀操作),
* 第三個引數可取0-3(0表示不用關心時間區域性性,取完addr的值之後便不用留在cache中,
* 而1、2、3表示時間區域性性逐漸增強)。
* __builtin_prefetch (const void *addr, ...)
*/#define prefetch(...) __builtin_prefetch(__va_args__)
/** * 判斷exp是否在編譯時就可以確定其為常量,
* 如果exp為常量,該函式返回1,否則返回0。
* 如果exp為常量,可以在**中做一些優化來減少處理exp的複雜度
*/#define constant_p(exp) __builtin_constant_p(exp)
#define const_p 123
/** * 判斷type1和type2是否是相同的資料型別,相同返回1,否則返回0。
* 該函式不區分const/volatile這樣的修飾符,即int和const int被認為是相同的型別
*/#define types_cmp_p(t1, t2) __builtin_types_compatible_p(t1, t2)
#if 0
#define foo(x) \
typeof(x) tmp = (x);\
if(__builtin_types_compatible_p(typeof(x), int))\
//do something...\
else \
//do something...\
tmp;
#endif //0
/** * 用來引導gcc進行條件分支**。在一條指令執行時,由於流水線的作用,
* cpu可以完成下一條指令的取指,這樣可以提高cpu的利用率。
* 在執行一條條件分支指令時,cpu也會預取下一條執行,但是如果條件分支跳轉到了其他指令,
* 那cpu預取的下一條指令就沒用了,這樣就降低了流水線的效率。
* 核心中的likely()和unlikely()就是通過__builtin_expect來實現的。
* __builtin_expect (long exp, long c)函式可以優化程式編譯後的指令序列,
* 使指令盡可能的順序執行,從而提高cpu預取指令的正確率。該函式的第二個引數c可取0和1,
*/#define except(exp, c) __builtin_expect(exp, c)
#define likely(x) __builtin_expect(!!x, 1)
#define unlikely(x) __builtin_expect(!!x, 0)
int main()
/**
*/
C 高效位運算函式 之 builtin
1.builtin popcount n 該函式時判斷n的二進位制中有多少個1 int n 15 二進位制為1111 cout builtin popcount n 該函式是判斷n的二進位制中1的個數的奇偶性 int n 15 二進位制為1111 int m 7 111 cout builtin p...
c 常見Built in總結
1 判斷是否為數字或字母 isalpha 如果是字母,返回乙個非零數 否則,返回0 isdigit 如果是數字 0 9 返回乙個非零數 否則,返回0 isalnum 如果是字母或數字,返回乙個非零數 否則,返回0 2 獲得長度 vector的長度 vectora return a.size stri...
高效位運算builtin函式
該函式時判斷n的二進位制中有多少個1 int n 15 二進位制為1111 cout builtin popcount n 該函式是判斷n的二進位制中1的個數的奇偶性 int n 15 二進位制為1111 int m 7 111 cout builtin parity n 該函式判斷n的二進位制末尾...