亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 3445 | 回復(fù): 16
打印 上一主題 下一主題

[內(nèi)核入門] 關(guān)于內(nèi)聯(lián)函數(shù)inline [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2016-04-28 10:10 |只看該作者 |倒序瀏覽
本帖最后由 allkillers 于 2016-04-28 10:12 編輯

一直看書上說內(nèi)聯(lián)函數(shù)是通過在使用時直接替換,沒有了調(diào)用的開銷,從而執(zhí)行效率很高。字面意思可以理解,但具體是怎么反映出執(zhí)行效率高的,真沒看出來。,如下分兩種情況進行匯編對比,如下:

第一種,inline函數(shù):
static inline void test(int i, int j)
{
}

int main(void)
{
    test(1,5);
    return 0;
}

匯編為:

00000000004004ed <test>:
  4004ed:       55                      push   %rbp
  4004ee:       48 89 e5                mov    %rsp,%rbp
  4004f1:       89 7d fc                mov    %edi,-0x4(%rbp)
  4004f4:       89 75 f8                mov    %esi,-0x8(%rbp)
  4004f7:       5d                      pop    %rbp
  4004f8:       c3                      retq

00000000004004f9 <main>:
  4004f9:       55                      push   %rbp
  4004fa:       48 89 e5                mov    %rsp,%rbp
  4004fd:       be 05 00 00 00          mov    $0x5,%esi
  400502:       bf 01 00 00 00          mov    $0x1,%edi
  400507:       e8 e1 ff ff ff          callq  4004ed <test>
  40050c:       b8 00 00 00 00          mov    $0x0,%eax
  400511:       5d                      pop    %rbp
  400512:       c3                      retq
  400513:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  40051a:       00 00 00
  40051d:       0f 1f 00                nopl   (%rax)


第二種,普通函數(shù):
static void test(int i, int j)
{
}

int main(void)
{
    test(1,5);
    return 0;
}
匯編為:
00000000004004ed <test>:
  4004ed:       55                      push   %rbp
  4004ee:       48 89 e5                mov    %rsp,%rbp
  4004f1:       89 7d fc                mov    %edi,-0x4(%rbp)
  4004f4:       89 75 f8                mov    %esi,-0x8(%rbp)
  4004f7:       5d                      pop    %rbp
  4004f8:       c3                      retq

00000000004004f9 <main>:
  4004f9:       55                      push   %rbp
  4004fa:       48 89 e5                mov    %rsp,%rbp
  4004fd:       be 05 00 00 00          mov    $0x5,%esi
  400502:       bf 01 00 00 00          mov    $0x1,%edi
  400507:       e8 e1 ff ff ff          callq  4004ed <test>
  40050c:       b8 00 00 00 00          mov    $0x0,%eax
  400511:       5d                      pop    %rbp
  400512:       c3                      retq
  400513:       66 2e 0f 1f 84 00 00    nopw   %cs:0x0(%rax,%rax,1)
  40051a:       00 00 00
  40051d:       0f 1f 00                nopl   (%rax)


結(jié)論:

從匯編來看并無區(qū)別,并沒有“內(nèi)聯(lián)”的動作,還是普通的函數(shù)調(diào)用啊,那究竟是怎么提高效率的?求解。

評分

參與人數(shù) 1可用積分 +6 收起 理由
Godbach + 6 很有意義的討論!

查看全部評分

論壇徽章:
9
程序設(shè)計版塊每日發(fā)帖之星
日期:2016-02-11 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-02-14 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-02-14 06:20:0015-16賽季CBA聯(lián)賽之吉林
日期:2016-03-23 17:25:0015-16賽季CBA聯(lián)賽之浙江
日期:2016-04-01 08:25:0615-16賽季CBA聯(lián)賽之山西
日期:2016-04-01 10:09:1915-16賽季CBA聯(lián)賽之廣夏
日期:2016-06-03 15:58:212016科比退役紀念章
日期:2016-07-28 17:42:5215-16賽季CBA聯(lián)賽之廣東
日期:2017-02-20 23:32:43
2 [報告]
發(fā)表于 2016-04-28 10:30 |只看該作者
回復(fù) 1# allkillers


    您可以去看一下“預(yù)處理”這個階段,inline 的處理是在這個階段,還沒到匯編階段
   

論壇徽章:
0
3 [報告]
發(fā)表于 2016-04-28 10:46 |只看該作者
預(yù)處理的處理結(jié)果更應(yīng)該在匯編中體現(xiàn)才對啊,如果匯編中都沒有體現(xiàn),只能在運行期體現(xiàn)了,例如#define N (30) ,預(yù)處理的結(jié)果就是你可以在匯編中看到常量“30”。我的看法是,因為相同的匯編碼必定會是相同的機器碼,相同的機器碼那就意味著執(zhí)行序列及效率必然相同。不知道我的理解有沒有問題。回復(fù) 2# Buddy_Zhang1


   

論壇徽章:
9
程序設(shè)計版塊每日發(fā)帖之星
日期:2016-02-11 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-02-14 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2016-02-14 06:20:0015-16賽季CBA聯(lián)賽之吉林
日期:2016-03-23 17:25:0015-16賽季CBA聯(lián)賽之浙江
日期:2016-04-01 08:25:0615-16賽季CBA聯(lián)賽之山西
日期:2016-04-01 10:09:1915-16賽季CBA聯(lián)賽之廣夏
日期:2016-06-03 15:58:212016科比退役紀念章
日期:2016-07-28 17:42:5215-16賽季CBA聯(lián)賽之廣東
日期:2017-02-20 23:32:43
4 [報告]
發(fā)表于 2016-04-28 10:55 |只看該作者
回復(fù) 3# allkillers

      你可以在您的 demo code 上使用下面命令來看預(yù)處理過程
      gcc xxx.c -E
   
      四個階段:預(yù)處理-編譯-匯編-鏈接
   

論壇徽章:
0
5 [報告]
發(fā)表于 2016-04-28 11:03 |只看該作者
好的,我再研究研究。但我貼出來的匯編代碼已經(jīng)是鏈接后的結(jié)果了,這一點應(yīng)該是確定的。回復(fù) 4# Buddy_Zhang1


   

論壇徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16賽季CBA聯(lián)賽之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金雞報曉
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年紀念徽章
日期:2016-11-09 13:19:1015-16賽季CBA聯(lián)賽之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序設(shè)計版塊每日發(fā)帖之星
日期:2015-12-03 06:20:002015七夕節(jié)徽章
日期:2015-08-21 11:06:17IT運維版塊每日發(fā)帖之星
日期:2015-08-09 06:20:002015亞冠之吉達阿赫利
日期:2015-07-03 08:39:42
6 [報告]
發(fā)表于 2016-04-28 11:06 |只看該作者
本帖最后由 amarant 于 2016-04-29 10:05 編輯

你沒有加優(yōu)化等級,默認不會內(nèi)聯(lián)。如果需要強行內(nèi)聯(lián),需要按下面語法操作。
GCC does not inline any functions when not optimizing unless you specify the ‘a(chǎn)lways_inline’ attribute for the function, like this:

     /* Prototype.  */
     inline void foo (const char) __attribute__((always_inline));

參考
https://gcc.gnu.org/onlinedocs/gcc/Inline.html

論壇徽章:
0
7 [報告]
發(fā)表于 2016-04-28 14:19 |只看該作者
可以參見gcc源碼中處理inline的兩個相關(guān)pass,pass_early_inline和pass_ipa_inline,pass_early_inline在不指定優(yōu)化選項-Onum時,只通過inline_always_inline_functions來內(nèi)聯(lián)指定了“always_inline”attribute的函數(shù),pass_ipa_inine在不指定優(yōu)化選項-Onum時直接返回不做任何inline處理

評分

參與人數(shù) 2可用積分 +10 信譽積分 +15 收起 理由
nswcfd + 5 學習了
amarant + 10 + 10 贊一個!

查看全部評分

論壇徽章:
11
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00CU十四周年紀念徽章
日期:2016-05-16 11:11:112016科比退役紀念章
日期:2016-05-04 17:16:57程序設(shè)計版塊每日發(fā)帖之星
日期:2016-02-20 06:20:00程序設(shè)計版塊每周發(fā)帖之星
日期:2015-11-06 19:30:58程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-12 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-11 06:20:00每日論壇發(fā)貼之星
日期:2015-09-10 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-10 06:20:00每日論壇發(fā)貼之星
日期:2015-09-09 06:20:0015-16賽季CBA聯(lián)賽之四川
日期:2016-12-15 15:52:10
8 [報告]
發(fā)表于 2016-04-28 16:18 |只看該作者
按說內(nèi)連函數(shù)是預(yù)處理階段直接處理的,匯編中應(yīng)該有函數(shù)調(diào)用保存現(xiàn)場的動作,是不是你的test函數(shù)太簡單,編譯器優(yōu)化掉了呢?

論壇徽章:
13
15-16賽季CBA聯(lián)賽之八一
日期:2016-07-08 21:00:1415-16賽季CBA聯(lián)賽之同曦
日期:2017-02-15 14:26:1515-16賽季CBA聯(lián)賽之佛山
日期:2017-02-20 14:19:2615-16賽季CBA聯(lián)賽之青島
日期:2017-05-07 16:49:1115-16賽季CBA聯(lián)賽之廣夏
日期:2017-07-30 09:13:1215-16賽季CBA聯(lián)賽之廣東
日期:2018-07-05 22:34:3615-16賽季CBA聯(lián)賽之江蘇
日期:2018-09-03 12:10:2115-16賽季CBA聯(lián)賽之上海
日期:2018-09-25 03:49:2215-16賽季CBA聯(lián)賽之廣東
日期:2018-09-25 04:09:12
9 [報告]
發(fā)表于 2016-04-28 16:41 |只看該作者
回復(fù) 8# 我愛你我的菜

我第一反應(yīng)也是優(yōu)化級別,分別加-O0、-O1、-O2編譯,看看有不有區(qū)別,內(nèi)聯(lián)函數(shù)不像宏函數(shù),編譯器“視情況”確定將其當作普通函數(shù)還是宏函數(shù),“視情況”估計就是看優(yōu)化級別是多少吧,沒試過。

論壇徽章:
11
程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-09 06:20:00CU十四周年紀念徽章
日期:2016-05-16 11:11:112016科比退役紀念章
日期:2016-05-04 17:16:57程序設(shè)計版塊每日發(fā)帖之星
日期:2016-02-20 06:20:00程序設(shè)計版塊每周發(fā)帖之星
日期:2015-11-06 19:30:58程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-12 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-11 06:20:00每日論壇發(fā)貼之星
日期:2015-09-10 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-09-10 06:20:00每日論壇發(fā)貼之星
日期:2015-09-09 06:20:0015-16賽季CBA聯(lián)賽之四川
日期:2016-12-15 15:52:10
10 [報告]
發(fā)表于 2016-04-28 16:50 |只看該作者
理解錯了,上面是inline沒有生效

生效代碼:
#include<stdio.h>

inline  static  void test(int i, int j)__attribute__ ((always_inline));
static  void test(int i, int j)
{
        int sum;
        sum=i+j;
}

int main(void)
{
    test(1,5);
    return 0;
}

對比匯編:
        .file        "1.c"
        .text
        .type        test, @function
test:
.LFB0:
        .cfi_startproc
        pushl        %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl        %esp, %ebp
        .cfi_def_cfa_register 5
        subl        $16, %esp
        movl        12(%ebp), %eax
        movl        8(%ebp), %edx
        addl        %edx, %eax
        movl        %eax, -4(%ebp)
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
.LFE0:
        .size        test, .-test
        .globl        main
        .type        main, @function
main:
.LFB1:
        .cfi_startproc
        pushl        %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl        %esp, %ebp
        .cfi_def_cfa_register 5
        subl        $8, %esp
        movl        $5, 4(%esp)
        movl        $1, (%esp)
        call        test
        movl        $0, %eax
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
.LFE1:
        .size        main, .-main
        .ident        "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3"
        .section        .note.GNU-stack,"",@progbits




inline匯編:
        .file        "2.c"
        .text
        .globl        main
        .type        main, @function
main:
.LFB1:
        .cfi_startproc
        pushl        %ebp
        .cfi_def_cfa_offset 8
        .cfi_offset 5, -8
        movl        %esp, %ebp
        .cfi_def_cfa_register 5
        subl        $16, %esp
        movl        $1, -12(%ebp)
        movl        $5, -8(%ebp)
        movl        -8(%ebp), %eax
        movl        -12(%ebp), %edx
        addl        %edx, %eax
        movl        %eax, -4(%ebp)
        movl        $0, %eax
        leave
        .cfi_restore 5
        .cfi_def_cfa 4, 4
        ret
        .cfi_endproc
.LFE1:
        .size        main, .-main
        .ident        "GCC: (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3"
        .section        .note.GNU-stack,"",@progbits
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP