GNU C語言的 擴充套件(六)內建函式

2021-06-26 09:59:45 字數 3094 閱讀 2750

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,以...