• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-91  評(píng)論-137  文章-0  trackbacks-0

            Lambda表達(dá)式提供了匿名函數(shù)這個(gè)概念,可以使您在一個(gè)函數(shù)中書(shū)寫(xiě)另一個(gè)匿名的函數(shù)體

            先來(lái)看下如何在VC2010中書(shū)寫(xiě)Lambda表達(dá)式

            [捕捉項(xiàng)表](參數(shù)表)->返回類型{函數(shù)體}
            捕捉項(xiàng)表中在變量前添加&操作符表示捕捉引用,添加=表示捕捉值
            參數(shù)表與"->"和后面的返回類型是可選的編譯器會(huì)由函數(shù)體內(nèi)的return語(yǔ)句判斷返回類型,當(dāng)返回類型很復(fù)雜時(shí)編譯器無(wú)法判斷,則必須手動(dòng)給出!

            下面舉個(gè)簡(jiǎn)單的例子:
             1 #include <stdio.h>
             2 
             3 int main()
             4 {
             5     int a = 100;
             6     [a]{
             7         printf("%d\n",a);
             8     }();
             9     return 0;
            10 }
            然后在VS2010提示中編譯它:cl /FAs a.cpp
            /FAs參數(shù)指定了輸出匯編文件a.asm.

            然后我們來(lái)看一下它生成的匯編代碼:
              1 ; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 
              2 
              3     TITLE    D:\a.cpp
              4     .686P
              5     .XMM
              6     include listing.inc
              7     .model    flat
              8 
              9 INCLUDELIB LIBCMT
             10 INCLUDELIB OLDNAMES
             11 
             12 PUBLIC    ??R<lambda0>@?A0x428ab923@@QBEXXZ        ; `anonymous namespace'::<lambda0>::operator()
             13 PUBLIC    ??0<lambda0>@?A0x428ab923@@QAE@ABH@Z        ; `anonymous namespace'::<lambda0>::<lambda0>
             14 PUBLIC    _main
             15 ; Function compile flags: /Odtp
             16 ; File d:\a.cpp
             17 _TEXT    SEGMENT
             18 $T3875 = -8                        ; size = 4
             19 _a$ = -4                        ; size = 4
             20 _main    PROC
             21 
             22 4    : {
             23 
             24     push    ebp
             25     mov    ebp, esp
             26     sub    esp, 8
             27 
             28 5    :     int a = 100;
             29 
             30     mov    DWORD PTR _a$[ebp], 100            ; 00000064H
             31 
             32 6    :     [a]{
             33 7    :         printf("%d\n",a);
             34 8    :     }();
             35 
             36     lea    eax, DWORD PTR _a$[ebp]
             37     push    eax
             38     lea    ecx, DWORD PTR $T3875[ebp]
             39     call    ??0<lambda0>@?A0x428ab923@@QAE@ABH@Z    ; `anonymous namespace'::<lambda0>::<lambda0>
             40     mov    ecx, eax
             41     call    ??R<lambda0>@?A0x428ab923@@QBEXXZ    ; `anonymous namespace'::<lambda0>::operator()
             42 
             43 9    :     return 0;
             44 
             45     xor    eax, eax
             46 
             47 10   : }
             48 
             49     mov    esp, ebp
             50     pop    ebp
             51     ret    0
             52 _main    ENDP
             53 ; Function compile flags: /Odtp
             54 _TEXT    ENDS
             55 ;    COMDAT ??0<lambda0>@?A0x428ab923@@QAE@ABH@Z
             56 _TEXT    SEGMENT
             57 _this$ = -4                        ; size = 4
             58 __A$ = 8                        ; size = 4
             59 ??0<lambda0>@?A0x428ab923@@QAE@ABH@Z PROC        ; `anonymous namespace'::<lambda0>::<lambda0>, COMDAT
             60 ; _this$ = ecx
             61 
             62 8    :     }();
             63 
             64     push    ebp
             65     mov    ebp, esp
             66     push    ecx
             67     mov    DWORD PTR _this$[ebp], ecx
             68     mov    eax, DWORD PTR _this$[ebp]
             69     mov    ecx, DWORD PTR __A$[ebp]
             70     mov    edx, DWORD PTR [ecx]
             71     mov    DWORD PTR [eax], edx
             72     mov    eax, DWORD PTR _this$[ebp]
             73     mov    esp, ebp
             74     pop    ebp
             75     ret    4
             76 ??0<lambda0>@?A0x428ab923@@QAE@ABH@Z ENDP        ; `anonymous namespace'::<lambda0>::<lambda0>
             77 _TEXT    ENDS
             78 PUBLIC    ??_C@_03PMGGPEJJ@?$CFd?6?$AA@            ; `string'
             79 EXTRN    _printf:PROC
             80 ;    COMDAT ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
             81 CONST    SEGMENT
             82 ??_C@_03PMGGPEJJ@?$CFd?6?$AA@ DB '%d', 0aH, 00H        ; `string'
             83 ; Function compile flags: /Odtp
             84 CONST    ENDS
             85 ;    COMDAT ??R<lambda0>@?A0x428ab923@@QBEXXZ
             86 _TEXT    SEGMENT
             87 _this$ = -4                        ; size = 4
             88 ??R<lambda0>@?A0x428ab923@@QBEXXZ PROC            ; `anonymous namespace'::<lambda0>::operator(), COMDAT
             89 ; _this$ = ecx
             90 
             91 6    :     [a]{
             92 
             93     push    ebp
             94     mov    ebp, esp
             95     push    ecx
             96     mov    DWORD PTR _this$[ebp], ecx
             97 
             98 7    :         printf("%d\n",a);
             99 
            100     mov    eax, DWORD PTR _this$[ebp]
            101     mov    ecx, DWORD PTR [eax]
            102     push    ecx
            103     push    OFFSET ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
            104     call    _printf
            105     add    esp, 8
            106 
            107 8    :     }();
            108 
            109     mov    esp, ebp
            110     pop    ebp
            111     ret    0
            112 ??R<lambda0>@?A0x428ab923@@QBEXXZ ENDP            ; `anonymous namespace'::<lambda0>::operator()
            113 _TEXT    ENDS
            114 END
            115 
            由匯編代碼可以看到先為L(zhǎng)ambda函數(shù)生成了一個(gè)匿名對(duì)象,然后調(diào)用了()的操作符重載函數(shù)調(diào)用這個(gè)匿名函數(shù).

            由此我們得出結(jié)論:調(diào)用一個(gè)匿名函數(shù)并沒(méi)有調(diào)用一個(gè)存在的函數(shù)或是一個(gè)類的成員函數(shù)快,只是書(shū)寫(xiě)更方便罷了.

            然后我們修改一下代碼,將匿名函數(shù)先賦給一個(gè)匿名函數(shù)指針,然后調(diào)用.
             1 #include <stdio.h>
             2 
             3 int main()
             4 {
             5     int a = 100;
             6     auto ptr = [a]{
             7         printf("%d\n",a);
             8     };
             9     ptr();
            10     return 0;
            11 }
            編譯后得到代碼:
              1 ; Listing generated by Microsoft (R) Optimizing Compiler Version 16.00.30319.01 
              2 
              3     TITLE    D:\a.cpp
              4     .686P
              5     .XMM
              6     include listing.inc
              7     .model    flat
              8 
              9 INCLUDELIB LIBCMT
             10 INCLUDELIB OLDNAMES
             11 
             12 PUBLIC    ??R<lambda0>@?A0x428ab923@@QBEXXZ        ; `anonymous namespace'::<lambda0>::operator()
             13 PUBLIC    ??0<lambda0>@?A0x428ab923@@QAE@ABH@Z        ; `anonymous namespace'::<lambda0>::<lambda0>
             14 PUBLIC    _main
             15 ; Function compile flags: /Odtp
             16 ; File d:\a.cpp
             17 _TEXT    SEGMENT
             18 _ptr$ = -8                        ; size = 4
             19 _a$ = -4                        ; size = 4
             20 _main    PROC
             21 
             22 4    : {
             23 
             24     push    ebp
             25     mov    ebp, esp
             26     sub    esp, 8
             27 
             28 5    :     int a = 100;
             29 
             30     mov    DWORD PTR _a$[ebp], 100            ; 00000064H
             31 
             32 6    :     auto ptr = [a]{
             33 7    :         printf("%d\n",a);
             34 8    :     };
             35 
             36     lea    eax, DWORD PTR _a$[ebp]
             37     push    eax
             38     lea    ecx, DWORD PTR _ptr$[ebp]
             39     call    ??0<lambda0>@?A0x428ab923@@QAE@ABH@Z    ; `anonymous namespace'::<lambda0>::<lambda0>
             40 
             41 9    :     ptr();
             42 
             43     lea    ecx, DWORD PTR _ptr$[ebp]
             44     call    ??R<lambda0>@?A0x428ab923@@QBEXXZ    ; `anonymous namespace'::<lambda0>::operator()
             45 
             46 10   :     return 0;
             47 
             48     xor    eax, eax
             49 
             50 11   : }
             51 
             52     mov    esp, ebp
             53     pop    ebp
             54     ret    0
             55 _main    ENDP
             56 ; Function compile flags: /Odtp
             57 _TEXT    ENDS
             58 ;    COMDAT ??0<lambda0>@?A0x428ab923@@QAE@ABH@Z
             59 _TEXT    SEGMENT
             60 _this$ = -4                        ; size = 4
             61 __A$ = 8                        ; size = 4
             62 ??0<lambda0>@?A0x428ab923@@QAE@ABH@Z PROC        ; `anonymous namespace'::<lambda0>::<lambda0>, COMDAT
             63 ; _this$ = ecx
             64 
             65 8    :     };
             66 
             67     push    ebp
             68     mov    ebp, esp
             69     push    ecx
             70     mov    DWORD PTR _this$[ebp], ecx
             71     mov    eax, DWORD PTR _this$[ebp]
             72     mov    ecx, DWORD PTR __A$[ebp]
             73     mov    edx, DWORD PTR [ecx]
             74     mov    DWORD PTR [eax], edx
             75     mov    eax, DWORD PTR _this$[ebp]
             76     mov    esp, ebp
             77     pop    ebp
             78     ret    4
             79 ??0<lambda0>@?A0x428ab923@@QAE@ABH@Z ENDP        ; `anonymous namespace'::<lambda0>::<lambda0>
             80 _TEXT    ENDS
             81 PUBLIC    ??_C@_03PMGGPEJJ@?$CFd?6?$AA@            ; `string'
             82 EXTRN    _printf:PROC
             83 ;    COMDAT ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
             84 CONST    SEGMENT
             85 ??_C@_03PMGGPEJJ@?$CFd?6?$AA@ DB '%d', 0aH, 00H        ; `string'
             86 ; Function compile flags: /Odtp
             87 CONST    ENDS
             88 ;    COMDAT ??R<lambda0>@?A0x428ab923@@QBEXXZ
             89 _TEXT    SEGMENT
             90 _this$ = -4                        ; size = 4
             91 ??R<lambda0>@?A0x428ab923@@QBEXXZ PROC            ; `anonymous namespace'::<lambda0>::operator(), COMDAT
             92 ; _this$ = ecx
             93 
             94 6    :     auto ptr = [a]{
             95 
             96     push    ebp
             97     mov    ebp, esp
             98     push    ecx
             99     mov    DWORD PTR _this$[ebp], ecx
            100 
            101 7    :         printf("%d\n",a);
            102 
            103     mov    eax, DWORD PTR _this$[ebp]
            104     mov    ecx, DWORD PTR [eax]
            105     push    ecx
            106     push    OFFSET ??_C@_03PMGGPEJJ@?$CFd?6?$AA@
            107     call    _printf
            108     add    esp, 8
            109 
            110 8    :     };
            111 
            112     mov    esp, ebp
            113     pop    ebp
            114     ret    0
            115 ??R<lambda0>@?A0x428ab923@@QBEXXZ ENDP            ; `anonymous namespace'::<lambda0>::operator()
            116 _TEXT    ENDS
            117 END
            118 
            和上面的直接調(diào)用并無(wú)差別,因?yàn)橐粋€(gè)匿名函數(shù)含有一個(gè)隱藏的對(duì)象.

            應(yīng)此__asm call ptr;這樣調(diào)用是錯(cuò)誤的!因?yàn)槟銦o(wú)法用call指令來(lái)調(diào)用一個(gè)對(duì)象的成員函數(shù).
            posted on 2011-02-17 16:32 lwch 閱讀(2679) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 其他
            国产欧美久久久精品影院| 中文字幕亚洲综合久久| 亚洲&#228;v永久无码精品天堂久久| 久久国产热精品波多野结衣AV| 日韩精品久久久久久免费| 久久精品www人人爽人人| 国产精品欧美久久久久天天影视| 久久久久亚洲AV无码专区桃色| 久久综合给合综合久久| 久久国产精品99国产精| 日本精品一区二区久久久| 久久精品亚洲中文字幕无码麻豆| 久久精品国产91久久麻豆自制| 亚洲人AV永久一区二区三区久久| 99久久99这里只有免费费精品| 看全色黄大色大片免费久久久| 久久久无码精品亚洲日韩按摩| 欧美激情精品久久久久久久| 国内精品久久久人妻中文字幕| 合区精品久久久中文字幕一区| 国产精品久久久久久影院| 欧美精品乱码99久久蜜桃| 久久www免费人成看国产片| 久久久久国产精品熟女影院| 久久久久久国产精品免费免费 | 精品久久久久久无码人妻蜜桃| 色婷婷综合久久久久中文 | 国内精品伊人久久久影院| 91久久香蕉国产熟女线看| 狠色狠色狠狠色综合久久| 日韩人妻无码一区二区三区久久| 亚洲精品视频久久久| 久久精品二区| 久久性生大片免费观看性| 久久人人爽人人爽AV片| 色综合合久久天天给综看| 久久无码AV中文出轨人妻| 人人狠狠综合久久亚洲高清| 亚洲精品国精品久久99热| 日韩中文久久| 97精品伊人久久久大香线蕉|