gnu c 提供了大量的內建函式,其中很多是標準 c 庫的內建版本,例如 memcpy(),它們與對應的 c 庫函式功能相同。而其他內建的名字通常以 __builtin 開始。
內建函式 __builtin_return_address 返回當前函式或其呼叫者的返回位址,引數 level 指定在棧上搜尋框架的個數,0 表示當前函式的返回位址,1 表示當前函式的呼叫者的返回位址,依次類推。
下面是測試**:
引用#include
int*
address;
int*
builtin_func ()
intmain()
執行及輸出:
引用beyes@linux-beyes:~/c/gnu_c_ext> ./builtin.exe
0x804844c
看一下 builtin.exe 的反彙編**:
引用08048436 :
8048436: 8d 4c 24 04 lea 0x4(%esp),%ecx
804843a: 83 e4 f0 and $0xfffffff0,%esp
804843d: ff 71 fc pushl -0x4(%ecx)
8048440: 55 push %ebp
8048441: 89 e5 mov %esp,%ebp
8048443: 51 push %ecx
8048444: 83 ec 14 sub $0x14,%esp
8048447: e8 d8 ff ff ff call 8048424
804844c: a1 1c a0 04 08 mov 0x804a01c,%eax
8048451: 89 44 24 04 mov %eax,0x4(%esp)
8048455: c7 04 24 30 85 04 08 movl $0x8048530,(%esp)
804845c: e8 f3 fe ff ff call 8048354
8048461: b8 00 00 00 00 mov $0x0,%eax
8048466: 83 c4 14 add $0x14,%esp
8048469: 59 pop %ecx
804846a: 5d pop %ebp
804846b: 8d 61 fc lea -0x4(%ecx),%esp
804846e: c3 ret
804846f: 90 nop
內建函式 __builtin_constant_p 用於判斷乙個值是否為編譯時的常數,如果引數 exp 的值是常數,函式返回 1,否則返回 0 。
測試**:
引用#include
#define size 100
intmain()
else
return0;}
執行及輸出:
引用beyes@linux-beyes:~/c/gnu_c_ext> ./builtin_const.exe
size is constant
內建函式 __builtin_expect 用於為編譯器提供分支**資訊,其返回值是整數表示式 exp 的值,c 的值必須是編譯時的常數。
測試程式:
引用#include
#define test 10
#define tst 16
intexpect (inta
,intb)
intmain()
b =8;
if( __builtin_expect((expect(a
, b)),
tst))
printf ("none expected\n");
return0;}
執行與輸出:
引用beyes@linux-beyes:~/c/gnu_c_ext> ./builtin_const.exe
沒有測試,只能先算是:expected test
這個內建函式的語義是 exp 的預期值是 c,編譯器可以根據這個資訊適當地重排語句塊的順序,使程式在預期的情況下有更高的執行效率。
GNU c對c的擴充套件
1.變長陣列 includeusing namespace std struct s int main for int i 0 i 6 i return 0 只用了一次malloc 效率更高。2.使case可以匹配乙個數值範圍 include using namespace std int main...
10GNU C語言函式呼叫
6.c 函式呼叫機制概述 在 linux 核心程式 boot head.s 執行完基本初始化操作之後,就會跳轉區執行 init main.c 程式。那麼 head.s 程式時如何把執行控制轉交給 init mian.c 程式呢?即匯程式設計序時如何呼叫執行 c 語言程式的?這裡我們首先描述一下 c ...
linux核心 使用的 gnu c 擴充套件
gnu cc是乙個功能非常強大的跨平台c編譯器,它對c語言提供了很多擴充套件,這些擴充套件對優化 目標 布局 更安全的檢查等方面提供了很強的支援。本文把支援gnu擴充套件的c語言稱為gnu c。linux核心 使用了大量的gnu c擴充套件,以至於能夠編譯linux核心的唯一編譯器是gnu cc,以...