欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ 中l(wèi)ambda表達(dá)式的編譯器實(shí)現(xiàn)原理

 更新時(shí)間:2017年02月15日 09:40:30   作者:freshui  
C++ 11加入了一個(gè)非常重要的特性——Lambda表達(dá)式。這篇文章主要介紹了C++ 中l(wèi)ambda表達(dá)式的編譯器實(shí)現(xiàn)原理,需要的朋友可以參考下

什么是Lambda?

C++ 11加入了一個(gè)非常重要的特性——Lambda表達(dá)式。營(yíng)里(戴維營(yíng))的兄弟都對(duì)Objective-C很熟悉,許多人多block情有獨(dú)鐘,將各種回調(diào)函數(shù)、代理通通都用它來(lái)實(shí)現(xiàn)。甚至有人選擇用FBKVOController、BlocksKit等開(kāi)源框架將KVO、控件事件處理都改為通過(guò)block解決。原因就是簡(jiǎn)單、方便、直觀,函數(shù)的定義和使用出現(xiàn)在同一個(gè)地方。這里的Lambda表達(dá)式實(shí)際上和block非常類似,當(dāng)然如果你用它和Swift語(yǔ)言的閉包比較,那就是一回事了。

現(xiàn)在,Android已經(jīng)全面轉(zhuǎn)向C++11/14標(biāo)準(zhǔn)了,看代碼的話,很多地方變化很大,新標(biāo)準(zhǔn)真的是有點(diǎn)顛覆性的,感覺(jué)已經(jīng)不會(huì)C++了。今天有看到lambda表達(dá)式,突然想看一下,這貨是怎么實(shí)現(xiàn)的,如下,寫了個(gè)例子,分別調(diào)用3個(gè)lambda表達(dá)式:

#include <stdlib.h> 
#include <stdio.h> 
//1. 無(wú)參數(shù) 
auto hello = [] () {printf( "Hello world!\n");}; 
// 2. 一個(gè)參數(shù) 
auto hello_int = [] (int val){ printf("the value is %d\n", val); }; 
int main(int argc, char **argv) { 
 hello(); 
 hello_int(argc); 
 // 3. 帶捕獲列表的lambda表達(dá)式 
 auto lambda = [argc, argv]() {printf("param: %d, path is:%s\n", argc, argv[0]);}; 
 lambda(); 
 return 0; 
}

很簡(jiǎn)單定義三個(gè)lambda表達(dá)式,lambda表達(dá)式就不細(xì)說(shuō)是什么了,基本上是介紹新標(biāo)準(zhǔn)的書,都會(huì)說(shuō)的很明白。這里想看一下,具體編譯器是怎么實(shí)現(xiàn)表達(dá)式的呢?第一印象,應(yīng)該是表達(dá)式按照內(nèi)聯(lián)函數(shù)的方式實(shí)現(xiàn)的吧,調(diào)用的地方自動(dòng)展開(kāi),這樣參數(shù)、捕獲列表啥的都很好實(shí)現(xiàn)。

簡(jiǎn)單看一下,編譯時(shí)不優(yōu)化,反匯編看一下,如下,調(diào)用的main函數(shù):

上面按順序調(diào)用的,就是代碼中對(duì)應(yīng)的三個(gè)lambda表達(dá)式。從這個(gè)反匯編看,貌似和猜想的不一樣是調(diào)了函數(shù)不是內(nèi)聯(lián)展開(kāi)。
紅色框住的調(diào)用函數(shù)[藍(lán)色是實(shí)際的符號(hào),灰色是demangle后的,分析看這個(gè)],分別是:

$_0::operator()(void)  
$_1::operator()(int) 
main::$_2::operator() const(void) 

這是三個(gè)重載的()操作符.. 調(diào)用前看到有壓入this參數(shù),這是對(duì)象的方法調(diào)用,從反匯編看,是棧上創(chuàng)建對(duì)象,然后直接使用,使用是通過(guò)operator()..

這貨不就是函數(shù)對(duì)象么????

OK,那就明白了,lambda表達(dá)式,編譯器自動(dòng)轉(zhuǎn)換成函數(shù)對(duì)象執(zhí)行。。。。

上面的例子,編譯器轉(zhuǎn)換的如下:

#include <stdlib.h> 
#include <stdio.h> 
class $_0 { 
public: 
 void operator() { 
 printf( "Hello world!\n"); 
 } 
}; 
class $_1 { 
public: 
 void operator(int va) { 
  printf("the value is %d\n", val); 
 } 
}; 
class main::$_2 { 
public: 
 main::$_2(int i, char **v): argc(i), argv(v) {} 
 //帶捕獲列表的,不能修改捕獲列表... 
 void operator() const { 
 printf("param: %d, path is:%s\n", argc, argv[0]); 
 } 
private: 
 int argc; 
 char **argv; 
} 
int main(int argc, char **argv) { 
 $_0 hello; 
 hello(); 
 $_1 hello_int; 
 hello_int(argc); 
 main::$_2 lambda(argc, argv); 
 lambda(); 
 return 0; 
}

這里,lambda轉(zhuǎn)換后的符號(hào),是編譯器自動(dòng)生成的,看起來(lái)稍有點(diǎn)別扭。

以上所述是小編給大家介紹的C++ 中l(wèi)ambda表達(dá)式的編譯器實(shí)現(xiàn)原理,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • C語(yǔ)言基于回溯算法解決八皇后問(wèn)題的方法

    C語(yǔ)言基于回溯算法解決八皇后問(wèn)題的方法

    這篇文章主要介紹了C語(yǔ)言基于回溯算法解決八皇后問(wèn)題的方法,簡(jiǎn)單描述了八皇后問(wèn)題,并結(jié)合實(shí)例形式分析了C語(yǔ)言使用回溯算法解決八皇后問(wèn)題的相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • Windows進(jìn)程崩潰問(wèn)題的定位方法

    Windows進(jìn)程崩潰問(wèn)題的定位方法

    這篇文章主要介紹了Windows進(jìn)程崩潰問(wèn)題的定位方法,本文使用nstd工具進(jìn)行進(jìn)程崩潰時(shí)內(nèi)存和堆棧轉(zhuǎn)儲(chǔ)的方法查明問(wèn)題所在,需要的朋友可以參考下
    2015-04-04
  • C語(yǔ)言各種操作符透徹理解上篇

    C語(yǔ)言各種操作符透徹理解上篇

    C 語(yǔ)言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符。讓我們通讀本篇來(lái)詳細(xì)了解吧
    2022-02-02
  • C語(yǔ)言中宏定義的妙用方法

    C語(yǔ)言中宏定義的妙用方法

    今天小編就為大家分享一篇關(guān)于C語(yǔ)言中宏定義的妙用方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 利用C語(yǔ)言實(shí)現(xiàn)順序表的實(shí)例操作

    利用C語(yǔ)言實(shí)現(xiàn)順序表的實(shí)例操作

    順序表是線性表中的一種重要的數(shù)據(jù)結(jié)構(gòu),也是最基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu),所以他不僅是學(xué)習(xí)中的重點(diǎn),也是應(yīng)用開(kāi)發(fā)非常常用的一種數(shù)據(jù)結(jié)構(gòu)。這篇文章介紹如何利用C語(yǔ)言實(shí)現(xiàn)順序表。
    2016-08-08
  • C++實(shí)現(xiàn)數(shù)據(jù)文件存儲(chǔ)與加載

    C++實(shí)現(xiàn)數(shù)據(jù)文件存儲(chǔ)與加載

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)數(shù)據(jù)文件存儲(chǔ)與加載,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • c語(yǔ)言常見(jiàn)圖片格式判斷實(shí)例

    c語(yǔ)言常見(jiàn)圖片格式判斷實(shí)例

    這篇文章介紹了c語(yǔ)言常見(jiàn)圖片格式判斷實(shí)例,有需要的朋友可以參考一下
    2013-09-09
  • C++入門教程之內(nèi)聯(lián)函數(shù)與extern?"C"詳解

    C++入門教程之內(nèi)聯(lián)函數(shù)與extern?"C"詳解

    C++中的內(nèi)聯(lián)函數(shù)與靜態(tài)函數(shù)靜態(tài)函數(shù)靜態(tài)函數(shù)的定義靜態(tài)函數(shù)又稱為內(nèi)部函數(shù),下面這篇文章主要給大家介紹了關(guān)于C++入門教程之內(nèi)聯(lián)函數(shù)與extern?"C"的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • OpenCV基于背景減除實(shí)現(xiàn)行人計(jì)數(shù)

    OpenCV基于背景減除實(shí)現(xiàn)行人計(jì)數(shù)

    本文主要介紹了如何使用OpenCV C++對(duì)視頻中的人流量進(jìn)行統(tǒng)計(jì)。文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)OpenCV有一定的幫助,需要的可以了解一下
    2022-01-01
  • 深入理解C/C++中的寫時(shí)拷貝

    深入理解C/C++中的寫時(shí)拷貝

    這篇文章主要給大家介紹了C/C++中寫時(shí)拷貝的相關(guān)資料,所謂寫時(shí)拷貝也就是拖延版的深拷貝,下面文章中介紹的非常清楚,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。
    2017-03-03

最新評(píng)論