青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-91  評論-137  文章-0  trackbacks-0

Lambda表達式提供了匿名函數這個概念,可以使您在一個函數中書寫另一個匿名的函數體

先來看下如何在VC2010中書寫Lambda表達式

[捕捉項表](參數表)->返回類型{函數體}
捕捉項表中在變量前添加&操作符表示捕捉引用,添加=表示捕捉值
參數表與"->"和后面的返回類型是可選的編譯器會由函數體內的return語句判斷返回類型,當返回類型很復雜時編譯器無法判斷,則必須手動給出!

下面舉個簡單的例子:
 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參數指定了輸出匯編文件a.asm.

然后我們來看一下它生成的匯編代碼:
  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 
由匯編代碼可以看到先為Lambda函數生成了一個匿名對象,然后調用了()的操作符重載函數調用這個匿名函數.

由此我們得出結論:調用一個匿名函數并沒有調用一個存在的函數或是一個類的成員函數快,只是書寫更方便罷了.

然后我們修改一下代碼,將匿名函數先賦給一個匿名函數指針,然后調用.
 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 
和上面的直接調用并無差別,因為一個匿名函數含有一個隱藏的對象.

應此__asm call ptr;這樣調用是錯誤的!因為你無法用call指令來調用一個對象的成員函數.
posted on 2011-02-17 16:32 lwch 閱讀(2694) 評論(0)  編輯 收藏 引用 所屬分類: 其他
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产精品黄色| 久久九九热re6这里有精品| 欧美四级电影网站| 欧美日韩美女| 欧美日韩一区二区三区在线 | 香蕉久久一区二区不卡无毒影院 | 久久一区免费| 免费亚洲电影| 国产精品xnxxcom| 亚洲伊人一本大道中文字幕| 欧美日韩国产小视频| 欧美日韩免费在线视频| 欧美色中文字幕| 国产视频在线观看一区| 国产一区二区欧美| 亚洲三级色网| 欧美一区二区三区免费大片| 久久理论片午夜琪琪电影网| 欧美高清不卡| 99精品欧美一区二区三区| 亚洲一区在线免费| 另类人畜视频在线| 国产精品h在线观看| 好吊色欧美一区二区三区视频| 亚洲国产精彩中文乱码av在线播放| 亚洲精品视频在线看| 亚洲欧美日韩中文在线制服| 麻豆国产精品一区二区三区 | 亚洲综合日韩在线| 美女精品在线观看| 亚洲性图久久| 欧美精品一区二区久久婷婷| 国产亚洲a∨片在线观看| 99精品免费| 欧美xx视频| 欧美一区2区视频在线观看 | 欧美色网一区二区| 在线免费观看视频一区| 性做久久久久久久久| 亚洲欧洲日韩女同| 亚洲欧美日韩国产成人| 欧美久久视频| 亚洲国产一区视频| 久久夜色精品国产欧美乱| 亚洲视频在线看| 欧美日韩mv| 亚洲精品乱码久久久久| 欧美成人按摩| 久久精品一区四区| 国产在线拍偷自揄拍精品| 欧美一区二区三区电影在线观看| 亚洲韩国青草视频| 欧美不卡视频一区| 亚洲黄色免费| 欧美激情精品久久久久久蜜臀 | 亚洲欧美在线免费观看| 欧美特黄一区| 亚洲一区二区三区乱码aⅴ| 亚洲精品乱码久久久久久| 国产欧美三级| 国产精品进线69影院| 亚洲激情视频网站| 欧美国产激情| 另类春色校园亚洲| 亚洲欧洲精品一区二区三区| 美女性感视频久久久| 久久久久综合网| 在线欧美一区| 亚洲福利精品| 欧美欧美全黄| 亚洲自拍偷拍一区| 亚洲欧美日韩精品| 国产欧美va欧美不卡在线| 欧美中日韩免费视频| 久久成人av少妇免费| 国产专区精品视频| 美女视频一区免费观看| 蜜月aⅴ免费一区二区三区| 亚洲精品美女| 亚洲精品中文字幕女同| 国产精品久久国产精品99gif| 午夜久久黄色| 久久久av水蜜桃| 亚洲精品日本| 亚洲一区二区三区乱码aⅴ| 国产欧美一区二区三区国产幕精品 | 亚洲欧美国产不卡| 欧美一区二区精品| 亚洲国产婷婷| 亚洲一卡二卡三卡四卡五卡| 国产亚洲欧美日韩美女| 亚洲大胆av| 欧美性猛交99久久久久99按摩 | 亚洲色图综合久久| 国产手机视频精品| 亚洲国产日韩在线| 国产美女扒开尿口久久久| 免费观看久久久4p| 欧美三级韩国三级日本三斤| 久久精品麻豆| 欧美另类变人与禽xxxxx| 久久九九99| 欧美日韩精品一区二区天天拍小说| 欧美一级淫片aaaaaaa视频| 免费成人高清在线视频| 欧美在线黄色| 欧美久久视频| 久久躁狠狠躁夜夜爽| 欧美视频一区二区三区四区| 免费av成人在线| 国产精品一区二区三区四区| 亚洲第一福利视频| 国产曰批免费观看久久久| 亚洲卡通欧美制服中文| 好吊日精品视频| 亚洲欧美视频在线观看| 亚洲高清精品中出| 99国产精品视频免费观看一公开| 久久国产主播| 亚洲欧洲日本一区二区三区| 亚洲视频综合在线| 亚洲高清视频中文字幕| 亚洲一区二区视频在线观看| 亚洲精品裸体| 久久在线免费视频| 久久九九免费| 国产精品一区二区你懂得| 91久久精品日日躁夜夜躁欧美 | 久久精品夜色噜噜亚洲a∨ | 久久不射电影网| 国产精品久久久久9999| 亚洲精品视频免费观看| 亚洲精品欧美专区| 欧美高清在线视频| 欧美大片18| 亚洲国产精品传媒在线观看| 久久久久久网址| 麻豆九一精品爱看视频在线观看免费| 国产欧美精品日韩| 午夜久久久久久| 久久久国产亚洲精品| 国产一区二区| 久久精品国产99国产精品澳门| 性做久久久久久久久| 国产视频一区在线观看| 欧美亚洲在线播放| 久久久综合免费视频| 在线精品视频一区二区三四| 久久人人97超碰精品888| 老牛嫩草一区二区三区日本| 亚洲国产精品激情在线观看| 免费人成网站在线观看欧美高清| 欧美国产丝袜视频| 一区二区三区四区五区视频 | 亚洲国产精品第一区二区三区| 久久伊人一区二区| 亚洲国产精品美女| 亚洲综合视频在线| 国产一区二区三区久久精品| 久久国产精品电影| 亚洲国产成人不卡| 亚洲一区二区免费| 国产自产2019最新不卡| 欧美jjzz| 亚洲一区在线观看免费观看电影高清| 久久久久久久高潮| 亚洲精品黄色| 国产精品入口尤物| 美女主播一区| 亚洲网站在线| 麻豆免费精品视频| 亚洲一区二区三区四区中文| 国内一区二区三区在线视频| 欧美激情亚洲另类| 欧美亚洲网站| 91久久久国产精品| 久久精品国产精品亚洲精品| 91久久黄色| 国产日韩欧美中文| 欧美午夜视频在线| 亚洲深夜福利网站| 麻豆视频一区二区| 亚洲欧美日本伦理| 亚洲国产另类 国产精品国产免费| 欧美国产亚洲另类动漫| 西西人体一区二区| 日韩亚洲欧美成人一区| 能在线观看的日韩av| 先锋影音一区二区三区| 日韩视频中午一区| 一区在线观看视频| 国产欧美日韩在线播放| 欧美日韩国产三级| 免费影视亚洲| 久久久久国产精品一区二区| 亚洲综合欧美日韩| 日韩视频免费在线观看| 欧美激情精品久久久| 美女性感视频久久久| 久久riav二区三区|