C語言內建函式 builtin

2021-09-11 22:32:00 字數 2649 閱讀 7879

首先內建函式有的屬於預編譯,有的屬於執行過程的函式,這一點我現在還不是很清楚,待以後進一步詳細討論。

然後我們給出乙個長**,裡面包含了常用的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的二進位制末尾...