linux的內建函式

2021-05-28 17:37:49 字數 1540 閱讀 7802

內建函式是與語言相關的(或者更準確地說是編譯器相關吧),作用應該是跟關鍵字一樣,無需申明,編譯器就知道它是什麼東西。同樣,無需#include任何標頭檔案,只要語法符合,編譯器就知道去哪兒鏈結相關**!另外,如果顯式申明的函式與內建函式同名,內建函式將會被覆蓋!

**: 

gnu c 提供了大量的內建函式,其中很多是標準 c 庫函式的內建版本,例如

memcpy,它們與對應的 c 庫函式功能相同,本文不討論這類函式,其他內建函式

的名字通常以 __builtin 開始。

* __builtin_return_address (level)

內建函式 __builtin_return_address 返回當前函式或其呼叫者的返回位址,引數

level 指定在棧上搜尋框架的個數,0 表示當前函式的返回位址,1 表示當前函式

++++ kernel/sched.c

437: printk(kern_err "schedule_timeout: wrong timeout "

438: "value %lx from %p\n", timeout,

439: __builtin_return_address(0));

* __builtin_constant_p(exp)

內建函式 __builtin_constant_p 用於判斷乙個值是否為編譯時常數,如果引數

exp 的值是常數,函式返回 1,否則返回 0。例如:

++++ include/asm-i386/bitops.h

249: #define test_bit(nr,addr) \

250: (__builtin_constant_p(nr) ? \

251: constant_test_bit((nr),(addr)) : \

252: variable_test_bit((nr),(addr)))

很多計算或操作在引數為常數時有更優化的實現,在 gnu c 中用上面的方法可以

根據引數是否為常數,只編譯常數版本或非常數版本,這樣既不失通用性,又能在

引數是常數時編譯出最優化的**。

* __builtin_expect(exp, c)

內建函式 __builtin_expect 用於為編譯器提供分支**資訊,其返回值是整數表

達式 exp 的值,c 的值必須是編譯時常數。例如:

++++ include/linux/compiler.h

13: #define likely(x) __builtin_expect((x),1)

14: #define unlikely(x) __builtin_expect((x),0)

++++ kernel/sched.c

564: if (unlikely(in_interrupt()))

這個內建函式的語義是 exp 的預期值是 c,編譯器可以根據這個資訊適當地重排

語句塊的順序,使程式在預期的情況下有更高的執行效率。上面的例子表示處於中

斷上下文是很少發生的,第 565-566 行的目標碼可能會放在較遠的位置,以保證

經常執行的目標碼更緊湊。

Linux內建函式練習

1 去目錄下複製檔案 root file ip.txt到自己目錄下,統計第一列 用空格隔開 ip的出現的頻率。awk nr 1end ip.txt 2 用awk 計算1 2 3 100的累計值 awk begin 3 用awk 寫入 shell 指令碼中,實現九九乘法表的列印 awk beginpr...

函式的呼叫 內建函式

函式是能夠實現特定功能的 塊。在我們呼叫乙個函式的時候,夢想便照進了現實,函式的功能就會實現。在所有的程式語言中,函式的實現都很簡單 直接呼叫函式名字,並提供引數即可。在程式中,絕大多數的函式是需要我們自己書寫的,但是在日常工作中有一些函式實現的功能是非常基本的,並且大家對結果的要求也一致,這些函式...

mysql 檢視內建函式 mysql內建函式

一 字串函式 1.concat s1,s2.sn 把傳入的引數連線成乙個字串 2.insert str,x,y,str 從str的x位置開始,替換y長度的字串為str,select insert abcdefg 2,3,hello 3.lower str upper str 將字串轉換為大寫,小寫 ...