自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++ lambda函數(shù)在程序開(kāi)發(fā)中作用體現(xiàn)

開(kāi)發(fā) 后端
C++ lambda函數(shù)的運(yùn)用,可以令聲明式的編程和運(yùn)算法則變得更加簡(jiǎn)單,方便??梢宰尵幊倘藛T以一種靈活的方式來(lái)實(shí)現(xiàn)程序的開(kāi)發(fā)。

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

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

循環(huán)函數(shù)是很重要的一個(gè)環(huán)節(jié),因?yàn)樵谒锌捎玫挠布Y源中,被分離的循環(huán)中的各個(gè)部分在一般情況下能夠提供更高的應(yīng)用性能。考慮這樣一個(gè)小情況:迭代選定組合中的全部元素以求得總和。最簡(jiǎn)單最直接的執(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];  

 

以上的例子十分便于人工讀寫。對(duì)于熟悉C語(yǔ)言家族語(yǔ)法的開(kāi)發(fā)者而言,這個(gè)循環(huán)的意圖也十分容易理解。然而對(duì)于編譯器以及運(yùn)行時(shí)庫(kù)的組合而言,要在多個(gè)線程之間計(jì)劃好這個(gè)循環(huán),它還需要類似于OpenMP編譯指示一類的指示來(lái)告訴它哪里有優(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];  

 

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

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

 

  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)被舍棄,求矢量和的代碼變得干凈了一些;但是由于需要使用一系列運(yùn)行符來(lái)定義一個(gè)類,這使得這個(gè)解決方案被大大的復(fù)雜化了。 除非代碼庫(kù)中還有大量類似的求和聲明,否則一個(gè)開(kāi)發(fā)者是不會(huì)僅僅為了STL for_each的那點(diǎn)好處而多花費(fèi)功夫去定義一個(gè)新類的。

仔細(xì)檢查這個(gè)Adder類,可以很明顯的看出其大部分內(nèi)容都僅僅是用來(lái)滿足將實(shí)例用作函數(shù)對(duì)象的調(diào)用條件的。這個(gè)類中唯一起到計(jì)算作用的僅僅是那一 行_total += i??紤]到這一點(diǎn),C++ 0x提供了一個(gè)被大大簡(jiǎn)化了的、以lambda函數(shù)方式來(lái)實(shí)現(xiàn)的語(yǔ)法技巧。C++ lambda函數(shù)移除了對(duì)這些搭架子代碼的需求,并允許在另外的一個(gè)聲明中定義 一個(gè)謂詞函數(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ù)的語(yǔ)法相當(dāng)直截了當(dāng)。方括號(hào)中的第一個(gè)lambda元素告訴編譯器,本地變量total通過(guò)引用被捕捉(這樣的情況下最好用引用捕 捉,因?yàn)槟阈枰噶亢偷慕Y(jié)果在for_each之后仍然有效),而lambda的第二部分則是參數(shù)列表。Lambda的最后一部分是函數(shù)的主體,這個(gè)例子 中就是將參數(shù)x的值加到變量total中去。

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

 

  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通過(guò)副本被捕捉。Visual C++編譯器在編譯時(shí)會(huì)報(bào)錯(cuò)C3491:'displayInput':一個(gè)在lambda函數(shù)內(nèi)數(shù)值被改變的變量無(wú)法在一個(gè)非可變lambda中通過(guò)數(shù)值被捕捉。

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

 

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

 

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

責(zé)任編輯:曹凱 來(lái)源: 博客園
相關(guān)推薦

2009-04-14 14:53:06

C++Lambda函數(shù)多線程

2009-12-29 14:00:02

WPF Dispatc

2022-02-14 11:25:53

C++lambda函數(shù)

2023-12-14 15:05:08

volatile代碼C++

2012-07-03 10:48:43

C++Lambda

2020-10-16 06:40:25

C++匿名函數(shù)

2009-11-25 17:54:47

PHP數(shù)組函數(shù)

2010-02-25 17:22:39

WCF服務(wù)行為

2009-12-24 17:52:05

WPF觸發(fā)器

2010-01-14 10:35:34

VB.NET指針

2009-12-04 17:31:32

PHP編碼轉(zhuǎn)換

2011-08-22 17:13:00

LuaC++函數(shù)

2023-10-30 11:45:44

FridaC++函數(shù)

2010-01-28 10:33:10

C++開(kāi)發(fā)程序

2009-12-29 14:58:31

WPF優(yōu)點(diǎn)

2010-01-27 17:16:52

C++構(gòu)造函數(shù)

2010-01-26 10:42:26

C++函數(shù)

2010-01-08 18:02:33

VB.NET事件

2023-11-20 09:57:03

內(nèi)聯(lián)函數(shù)C++

2010-01-15 13:30:53

VB.NET Tool
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)