成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在C++中使用Lambda函數(shù)提高代碼性能

原創(chuàng)
開發(fā) 后端
代碼在多核多處理器的環(huán)境下運(yùn)行時要想充分提高運(yùn)行性能,可以通過OpenMP編譯指示來完成;不過C++提供了一個更加方便的使用Lambda函數(shù)實(shí)現(xiàn)性能提升的方法。文章通過一個簡單的循環(huán)函數(shù)例子說明了這個方法。

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

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

std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total = 0;
for (int ix = 0; ix ﹤ v.size(); ++ix){
total += v[ix];
}

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

std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total = 0;
#pragma omp for
for (int ix = 0; ix ﹤ v.size(); ++ix){
#pragma omp atomic
total += v[ix];
}

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

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

class Adder{
private:
int _total;
public:
Adder() : _total(0) {}

void operator ( ) ( int& i )
{
_total += i;
}

operator int ( )
{
return _total;
}
};

void VectorAdd()
{
std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total = std::for_each(v.begin(), v.end(), Adder());
}

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

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

std::vector﹤int﹥ v;
v.push_back(1);
v.push_back(5);
int total = 0;
std::for_each(v.begin(), v.end(),
[&total](int x) {total += x;}
);

Lambda函數(shù)的語法相當(dāng)直截了當(dāng)。方括號中的***個lambda元素告訴編譯器,本地變量total通過引用被捕捉(這樣的情況下***用引用捕捉,因?yàn)槟阈枰噶亢偷慕Y(jié)果在for_each之后仍然有效),而lambda的第二部分則是參數(shù)列表。Lambda的***一部分是函數(shù)的主體,這個例子中就是將參數(shù)x的值加到變量total中去。

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

std::for_each(v.begin(), v.end(), [](int x) {
std::cout ﹤﹤ x ﹤﹤ std::endl;
});

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

int total = 0;
bool displayInput = true;
std::for_each(v.begin(), v.end(), [&total, displayInput](int x) {
total += x;
if (displayInput){
std::cout ﹤﹤ x ﹤﹤ std::endl;
}
});

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

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

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

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

原文:C++ Lambda Function – Making Coding Easier by Nick Wienholt

【編輯推薦】

  1. 橫向技術(shù)分析C#、C++和Java優(yōu)劣
  2. Lambda表達(dá)式入門實(shí)例
  3. .NET 3.x新特性之Lambda表達(dá)式
責(zé)任編輯:yangsai 來源: 51CTO.com
相關(guān)推薦

2010-02-02 13:15:00

C++ lambda函

2012-08-20 10:43:50

IBMdW

2011-05-12 18:14:29

算法

2022-02-14 11:25:53

C++lambda函數(shù)

2012-07-03 10:48:43

C++Lambda

2020-10-16 06:40:25

C++匿名函數(shù)

2023-10-30 11:45:44

FridaC++函數(shù)

2011-05-17 16:20:46

C++

2011-03-30 10:41:11

C++數(shù)據(jù)庫

2010-02-02 15:59:32

C++賦值函數(shù)

2010-02-05 10:23:09

C++基本函數(shù)

2023-11-02 08:25:58

C++Lambda

2020-03-03 19:00:50

C語言數(shù)據(jù)科學(xué)

2010-01-25 09:50:58

C++函數(shù)對象

2023-09-25 13:28:14

C++Lambda

2023-11-20 09:57:03

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

2011-05-18 18:05:47

C#C++

2011-05-18 17:56:38

C#C++

2023-09-20 23:03:40

C++函數(shù)

2010-03-10 19:18:10

Python scri
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 免费成人在线网站 | 亚洲国产精品成人 | 久草视频在线播放 | 韩日一区二区三区 | 福利精品在线观看 | 免费观看的av | 超碰免费在线 | 国产精品久久久久久福利一牛影视 | 国产精品一区久久久 | 四虎影院在线免费观看 | 欧日韩在线观看 | 国产精品99久久久久久久久久久久 | 国产在线观看不卡一区二区三区 | 99视频在线播放 | 午夜成人免费视频 | 91精品国产手机 | 国产高清视频 | 亚州精品天堂中文字幕 | 理论片免费在线观看 | 天天干 夜夜操 | 免费日本视频 | 91亚洲国产成人精品一区二三 | 免费99视频 | 另类 综合 日韩 欧美 亚洲 | 久久综合一区二区 | 欧美日韩精品一区二区三区蜜桃 | 一区二区欧美在线 | 国产一区二区三区在线 | 97久久久 | 久久久久国产一区二区 | 看a网站 | 综合久久一区 | 一区二区免费在线观看 | 日韩高清国产一区在线 | 99久久婷婷国产精品综合 | 9久久精品 | 亚洲一区二区av | 久久久久久综合 | 国产精品自产拍 | 亚洲欧美精品久久 | avav在线看|