C++11新特性中的匿名函數Lambda表達式的彙編實現分析(三)

C++11新特性中的匿名函數Lambda表達式的彙編實現分析(一)閉包

C++11新特性中的匿名函數Lambda表達式的彙編實現分析(二)函數

Lambda表達式中較複雜的形式以下:
學習

[ capture ] ( params ) -> ret { body }

如今咱們構造一個簡單的Lambda閉包函數進行分析:
this

int main()
{
	int c = 10;
	auto lambda = [&] (int a, int b)->int{
		return a + b - c;
	};
	int r = lambda(1, 2);

	return 0;
}

上面的代碼中,lambda表達式要求傳遞兩個參數a和b,並按引用捕獲c,計算後的結果返回給r。編碼

相應的彙編碼以下:spa

int c = 10;
 mov         dword ptr [ebp-8],0Ah  
	auto lambda = [&] (int a, int b)->int{
		return a + b - c;
	};
 lea         eax,[ebp-8]  
 push        eax  
 lea         ecx,[ebp-14h]  
 call        010E13B0  
	int r = lambda(1, 2);
 push        2  
 push        1  
 lea         ecx,[ebp-14h]  
 call        010E1400  
 mov         dword ptr [ebp-20h],eax  

	return 0;
 xor         eax,eax

顯而易見的,和前面兩篇文中的同樣,這裏僅做簡要說明:
.net

因爲Lambda表達式中捕獲了c,所以這裏第一個lea指令,向複製函數傳遞了c的地址,第二條lea指令向複製函數傳遞了this用於記錄捕獲對象的地址,指針

發生調用時,兩個push按照stdcall的方式,從右向左壓棧。並向表達式傳入了this用於尋址。code

lambda調用完畢的返回值默認放在eax中,所以,這裏最後一個mov意思是將閉包的函數返回值寫入r中。
對象

那麼,再看看閉包內如何處理傳入參數的以及如何返回的?其實就像普通函數同樣的原理,之前的博文也說到過函數調用的彙編原理,這裏再簡單說說吧。

 pop         ecx  
 mov         dword ptr [ebp-8],ecx  
		return a + b - c;
 mov         eax,dword ptr [ebp+8]  
 add         eax,dword ptr [ebp+0Ch]  
 
 mov         ecx,dword ptr [ebp-8]  
 mov         edx,dword ptr [ecx]  
 sub         eax,dword ptr [edx]

參數[ebp+8] = a ;[ebp+0Ch] = b

eax每每是放臨時量,edx每每是放地址,按照這個經驗,很容易看出,後面兩個mov取出*this(獲得的是&c)而後從a+b中減去*(&c),結果放在eax中,ret返回後供主函數中的r獲取之。


三篇博文的總結:

C++11中lambda表達式在形式上改變了函數的書寫,使函數調用更加簡潔靈活,閉包函數也是許多高級語言的特性之一。

Lambda表達式並非一個神奇的東西,萬變不離其宗,他仍然是以一個函數的形式存在於彙編中,底層處理和普通函數基本同樣。

Lambda表達式和普通函數在源程序的實現上有不一樣:

    Lambda表達式一般被做爲參數傳遞給另外一個函數,它自己做爲callback,以此避免在其餘地方寫出完整函數或使用函數指針。

Lambda表達式和普通函數在彙編層上的實現基本相同:

    最特殊的地方是,當閉包中要使用自己做用域外的變量時,須要進行「捕獲」,而捕獲實際上是經過另外一個隱藏的(源代碼不可見),我叫它複製函數(或者叫準備函數吧)來實現的,具體實現根據捕獲方式的不一樣而不一樣,大致上是一系列賦值語句。

    閉包中經過傳入的this指針(不能直接使用)對捕獲的變量或者對象進行操做。

關於捕獲方式中的按值或者按引用的概念,和普通函數一致。


好了,說到這裏,Lambda表達式的底層實現基本說到,本系列博文均屬原創,感謝開源中國OSChina提供這樣一個學習交流的平臺,讀者若有其它看法,歡迎評論!

最後送你們一句話,也是原創的。

咱們不須要重複造輪子,可是咱們必須具備造輪子的能力。

相關文章
相關標籤/搜索