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

隨筆-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 閱讀(2697) 評論(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>
            一区二区三区在线不卡| 欧美成人乱码一区二区三区| 久久久久久网| 亚洲欧美欧美一区二区三区| 麻豆精品在线视频| 久久国产色av| 国产精品拍天天在线| 亚洲精品一区二区三区在线观看| 国产一区二区三区高清播放| 在线视频欧美日韩| 日韩午夜视频在线观看| 久久久久久穴| 久久影音先锋| 国产亚洲欧洲| 欧美综合77777色婷婷| 午夜亚洲福利| 国产精品久久久久一区二区三区| 日韩午夜av| 一区二区三区精品| 欧美大片免费看| 亚洲国产精品99久久久久久久久| 黄色成人在线| 久久香蕉国产线看观看网| 可以免费看不卡的av网站| 国产亚洲精品久| 久久av一区| 久久综合久久综合这里只有精品 | 一区二区三区精品视频| 欧美精品一区二区三区很污很色的| 亚洲成人在线网站| 亚洲精品无人区| 欧美区一区二| 亚洲天堂成人在线观看| 欧美在线观看一区二区| 国产亚洲欧洲| 久久综合色影院| 91久久中文| 亚洲欧美日韩国产| 国产一区二区三区在线观看免费视频 | 欧美一级电影久久| 国内精品**久久毛片app| 久久久999精品| 亚洲国产精品毛片| 一区二区三区高清在线| 国产精品免费区二区三区观看| 亚洲一区二区三区四区五区黄| 午夜在线一区二区| 在线播放国产一区中文字幕剧情欧美| 久久青草久久| 一区二区电影免费观看| 久久国产成人| 亚洲精品久久久久久下一站 | 亚洲精品综合在线| 国产精品chinese| 久久精品动漫| 亚洲乱码国产乱码精品精| 性高湖久久久久久久久| 亚洲电影成人| 国产精品久久综合| 久久综合免费视频影院| 一区二区日韩免费看| 久久五月天婷婷| 亚洲少妇诱惑| 在线观看一区欧美| 国产精品福利在线观看| 久久久久9999亚洲精品| 99国产精品| 欧美www在线| 羞羞漫画18久久大片| 亚洲欧洲综合| 国内精品写真在线观看| 欧美日韩在线大尺度| 久久久久久穴| 亚洲欧美日韩电影| 亚洲理论电影网| 欧美成人综合在线| 欧美一区午夜视频在线观看| 日韩手机在线导航| 一区在线免费观看| 国产精品亚洲第一区在线暖暖韩国| 欧美成人亚洲成人| 久久久综合香蕉尹人综合网| 亚洲天堂av在线免费| 亚洲欧洲精品成人久久奇米网 | 亚洲破处大片| 久久综合导航| 久久国产直播| 亚洲永久免费av| 99re66热这里只有精品4| 亚洲成人在线视频播放| 国产女同一区二区| 欧美午夜一区二区福利视频| 暖暖成人免费视频| 另类av导航| 久久亚洲电影| 久久久99国产精品免费| 欧美专区亚洲专区| 欧美一区成人| 欧美中文字幕不卡| 亚洲欧美一区二区激情| 一本色道88久久加勒比精品 | 国产伦精品一区二区三区| 欧美日本韩国在线| 欧美日本中文| 欧美日韩精品免费看| 欧美激情黄色片| 欧美激情自拍| 欧美日本一区二区高清播放视频| 欧美不卡在线视频| 欧美激情一级片一区二区| 欧美国产成人精品| 欧美精品亚洲精品| 欧美日韩一区在线| 国产精品v欧美精品v日韩| 国产精品高潮呻吟视频| 欧美性感一类影片在线播放| 欧美午夜宅男影院在线观看| 欧美三级韩国三级日本三斤| 国产精品理论片在线观看| 国产伦精品一区二区三区视频孕妇| 国产精品亚洲аv天堂网| 国产欧美一区二区三区在线老狼 | 亚洲社区在线观看| 亚洲女同同性videoxma| 久久国产欧美| 老鸭窝91久久精品色噜噜导演| 男人的天堂成人在线| 欧美精品激情| 国产精品免费看片| 国产一区二区三区在线播放免费观看| 精品福利免费观看| 亚洲精品专区| 欧美一区二区三区精品| 老巨人导航500精品| 亚洲国产精品传媒在线观看 | 亚洲日本免费| 午夜精品久久久久久久久久久久久| 欧美在线免费看| 欧美成人日本| 亚洲一级在线| 免费在线播放第一区高清av| 欧美日韩午夜剧场| 好吊色欧美一区二区三区视频| 亚洲精品美女免费| 午夜精品999| 免费成人av资源网| 亚洲天堂男人| 久久亚洲一区二区三区四区| 欧美午夜片在线观看| 在线观看国产欧美| 亚洲在线观看视频网站| 美女日韩在线中文字幕| 亚洲香蕉成视频在线观看| 狼狼综合久久久久综合网| 国产精品高清网站| 亚洲国产人成综合网站| 欧美一二三区在线观看| 91久久精品国产91久久性色tv| 亚洲欧美日韩视频二区| 欧美精品免费观看二区| 黄色av一区| 欧美在线观看一区| 一本一本久久a久久精品牛牛影视| 久久久久久久性| 国产精品免费久久久久久| 亚洲精品之草原avav久久| 久久久五月婷婷| 一区二区高清视频在线观看| 欧美freesex交免费视频| 黄色精品一区二区| 欧美一级久久久| 一区二区三区久久精品| 蜜臀99久久精品久久久久久软件| 国产日韩欧美精品| 亚洲一区在线观看视频| 亚洲日本电影在线| 欧美成人精品1314www| 一区二区视频免费在线观看| 欧美在线视频一区二区三区| 一级日韩一区在线观看| 欧美日韩国产在线一区| 亚洲区一区二区三区| 女主播福利一区| 久久av老司机精品网站导航| 国产美女一区| 久久精品二区三区| 欧美在线一二三四区| 国产女同一区二区| 欧美在线播放高清精品| 亚洲一区免费在线观看| 国产精品免费一区二区三区在线观看 | 亚洲日本va午夜在线电影 | 久久国产精品久久国产精品| 国产美女精品免费电影| 欧美怡红院视频| 欧美一区二区免费视频| 国内精品久久久久影院优| 久久在精品线影院精品国产| 久久久精品一区| 亚洲欧洲日本mm|