日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C++lambda函數(shù)在程序開發(fā)中作用體現(xiàn)

作為一個編程人員,在運用一個語言進行程序開發(fā)時,都想通過各種辦法來提高自己程序的性能以及提高編程效率。那么在C++語言中,又該如何操作呢?我們在這里為大家介紹的額C++ lambda函數(shù),就是一個可以使代碼性能有較大提升的函數(shù)。#t#

創(chuàng)新互聯(lián)公司憑借在網(wǎng)站建設(shè)、網(wǎng)站推廣領(lǐng)域領(lǐng)先的技術(shù)能力和多年的行業(yè)經(jīng)驗,為客戶提供超值的營銷型網(wǎng)站建設(shè)服務(wù),我們始終認為:好的營銷型網(wǎng)站就是好的業(yè)務(wù)員。我們已成功為企業(yè)單位、個人等客戶提供了做網(wǎng)站、成都網(wǎng)站設(shè)計服務(wù),以良好的商業(yè)信譽,完善的服務(wù)及深厚的技術(shù)力量處于同行領(lǐng)先地位。

使編譯器以及操作系統(tǒng)從正在創(chuàng)建的應(yīng)用中榨取更高性能的關(guān)鍵在于提供充足的有關(guān)代碼意圖的信息。在充分了解這個代碼意圖實現(xiàn)的功能等信息的情況下, 就有可能將代碼在編譯時和運行時的并行吞吐量最大化,令開發(fā)者可以將更多精力放在他們所關(guān)注的商業(yè)領(lǐng)域的問題,將重量級的多核多處理器的任務(wù)計劃交托給編 譯器,運行時庫以及操作系統(tǒng)中的基礎(chǔ)設(shè)施代碼來處理。

循環(huán)函數(shù)是很重要的一個環(huán)節(jié),因為在所有可用的硬件資源中,被分離的循環(huán)中的各個部分在一般情況下能夠提供更高的應(yīng)用性能??紤]這樣一個小情況:迭代選定組合中的全部元素以求得總和。最簡單最直接的執(zhí)行方法如下:

 
 
 
  1. std::vector< int> v;  
  2. v.push_back(1);  
  3. v.push_back(5);  
  4. int total = 0;  
  5. for (int ix = 0; ix <  v.size(); ++ix){  
  6. total += v[ix];  

以上的例子十分便于人工讀寫。對于熟悉C語言家族語法的開發(fā)者而言,這個循環(huán)的意圖也十分容易理解。然而對于編譯器以及運行時庫的組合而言,要在多個線程之間計劃好這個循環(huán),它還需要類似于OpenMP編譯指示一類的指示來告訴它哪里有優(yōu)化的空間:

 
 
 
  1. std::vector< int> v;  
  2. v.push_back(1);  
  3. v.push_back(5);  
  4. int total = 0;  
  5. #pragma omp for  
  6. for (int ix = 0; ix <  v.size(); ++ix){  
  7. #pragma omp atomic  
  8. total += v[ix];  

第一個OpenMP指示提出了多線程運行for循環(huán)的要求,而第二個omp atomic指示則被用來防止多線程同時向總數(shù)變量上寫入。對于OpenMP,在MSDN庫的參考文檔中有關(guān)于所有指示的詳細介紹。

如果使用了聲明式循環(huán)技巧,那么將并行方法應(yīng)用在矢量求和上則更加干凈簡單。STL for_each函數(shù)是一個理想的替代品,以上的例子則被改寫如下:

 
 
 
  1. class Adder{  
  2. private:  
  3. int _total;  
  4. public:  
  5. Adder() : _total(0) {}  
  6. void operator ( ) ( int& i )  
  7. {  
  8. _total += i;  
  9. }  
  10. operator int ( )  
  11. {  
  12. return _total;  
  13. }  
  14. };  
  15. void VectorAdd()  
  16. {  
  17. std::vector< int> v;  
  18. v.push_back(1);  
  19. v.push_back(5);  
  20. int total = std::for_each(v.begin(), v.end(), Adder());  

這里,具體的for循環(huán)被舍棄,求矢量和的代碼變得干凈了一些;但是由于需要使用一系列運行符來定義一個類,這使得這個解決方案被大大的復(fù)雜化了。 除非代碼庫中還有大量類似的求和聲明,否則一個開發(fā)者是不會僅僅為了STL for_each的那點好處而多花費功夫去定義一個新類的。

仔細檢查這個Adder類,可以很明顯的看出其大部分內(nèi)容都僅僅是用來滿足將實例用作函數(shù)對象的調(diào)用條件的。這個類中唯一起到計算作用的僅僅是那一 行_total += i??紤]到這一點,C++ 0x提供了一個被大大簡化了的、以lambda函數(shù)方式來實現(xiàn)的語法技巧。C++ lambda函數(shù)移除了對這些搭架子代碼的需求,并允許在另外的一個聲明中定義 一個謂詞函數(shù)。由此,VectorAdd函數(shù)可以被改寫如下:

 
 
 
  1. std::vector< int> v;  
  2. v.push_back(1);  
  3. v.push_back(5);  
  4. int total = 0;  
  5. std::for_each(v.begin(), v.end(),  
  6. [&total](int x) {total += x;}  
  7. ); 

Lambda函數(shù)的語法相當(dāng)直截了當(dāng)。方括號中的第一個lambda元素告訴編譯器,本地變量total通過引用被捕捉(這樣的情況下最好用引用捕 捉,因為你需要矢量和的結(jié)果在for_each之后仍然有效),而lambda的第二部分則是參數(shù)列表。Lambda的最后一部分是函數(shù)的主體,這個例子 中就是將參數(shù)x的值加到變量total中去。

如果在C++ lambda函數(shù)中沒有需要捕捉的變量,或者只需要捕捉變量的一個副本,那么函數(shù)開始的方括號可以留空:

 
 
 
  1. std::for_each(v.begin(), v.end(), [](int x) {  
  2. std::cout < <  x < <  std::endl;  
  3. }); 

混合的捕捉方法也可以使用:

 
 
 
  1. int total = 0;  
  2. bool displayInput = true;  
  3. std::for_each(v.begin(), v.end(), [&total, displayInput](int x) {  
  4. total += x;  
  5. if (displayInput){  
  6. std::cout < <  x < <  std::endl;  
  7. }  
  8. }); 

這里,變量displayInput通過副本被捕捉。Visual C++編譯器在編譯時會報錯C3491:'displayInput':一個在lambda函數(shù)內(nèi)數(shù)值被改變的變量無法在一個非可變lambda中通過數(shù)值被捕捉。

Lambda函數(shù)中還有一個值得注意的地方,就是它的返回值類型。編譯器一般會盡可能的(也是被要求的)推斷l(xiāng)ambda表達式的返回值類型,不過 對于復(fù)雜的多行表達式而言,有可能會需要確切的聲明返回值類型。返回值類型聲明通過在lambda函數(shù)參數(shù)和函數(shù)主體之間添加-﹥運行符以及需要被聲明的 返回值類型來實現(xiàn):

 
 
 
  1. std::for_each(v.begin(), v.end(),   
  2. [&](int x)->void {total += x;});  

C++ lambda函數(shù)的出現(xiàn),這令聲明式編程以及使用STL運算法則變得更加簡潔。Lambda函數(shù)允許在函數(shù)主體內(nèi)的可執(zhí)行代碼字行間進行定義。在為 編譯器提供強大的優(yōu)化提示之外,Lambda函數(shù)所推崇的代碼模式可以令人更加簡單的理解哪段代碼是要實現(xiàn)怎樣的功能。Visual C++ 2010將帶來在并行處理上的顯著功能提升,而lambda函數(shù)將是具體實現(xiàn)這些提升的重要手段之一。


當(dāng)前文章:C++lambda函數(shù)在程序開發(fā)中作用體現(xiàn)
URL網(wǎng)址:http://www.dlmjj.cn/article/ccopgod.html