您好,登錄后才能下訂單哦!
本篇文章為大家展示了如何在lambda表達(dá)式中使用引用形式捕捉局部變量,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲
F.52 在lambda表達(dá)式中使用引用形式捕捉局部變量,包含向算法傳遞變量的情況。
譯者注:如果你不清楚捕捉(capture)是什么
Reason(原因)
為了效率和正確性,在本地使用lambda表達(dá)式時,你差不多總是需要通過引用方式捕捉變量。這包括編寫或者調(diào)用本地并發(fā)算法的情況,因為它們需要在返回前匯合(從而保證安全性,譯者注)。
關(guān)于效率的考慮:對于大多數(shù)類型來說,傳引用都會比傳值的成本更低。
關(guān)于正確性的考慮:許多調(diào)用都希望(在被調(diào)用函數(shù)被執(zhí)行的同時,)對處于調(diào)用側(cè)的原始對象產(chǎn)生連帶效果(參考下面的示例)。傳值做不到這一點。
不幸的是,對于局部調(diào)用,不存在簡單的方法可以通過引用捕捉常量類型變量獲得效率又可以避免連帶效果。
譯者注:常量類型應(yīng)用應(yīng)該指的是在函數(shù)聲明中的被聲明為常量的引用參數(shù),通過這種方式可以同時提供高效率和寫保護(hù)。
這里,一個大對象(一個網(wǎng)絡(luò)消息)傳遞給一個迭代算法,拷貝該消息不是高效或者正確的做法(它也許不能拷貝):
std::for_each(begin(sockets), end(sockets), [&message](auto& socket){ socket.send(message);});
譯者注:每次循環(huán)都拷貝的代價也很高。
這是一個簡單的三階段并發(fā)管道。每個state對象封裝一個工作線程和一個隊列,有一個process函數(shù)處理入隊,它的析構(gòu)函數(shù)在關(guān)閉線程之前自動地進(jìn)入阻塞狀態(tài)以等待隊列變空。
void send_packets(buffers& bufs){ stage encryptor([] (buffer& b){ encrypt(b); }); stage compressor([&](buffer& b){ compress(b); encryptor.process(b); }); stage decorator([&](buffer& b){ decorate(b); compressor.process(b); }); for (auto& b : bufs) { decorator.process(b); }} // automatically blocks waiting for pipeline to finish
譯者注:代碼中使用的是隱式捕捉,具體可以參考:https://mp.weixin.qq.com/s/RNpLqwekN3BJUbIN-DwVxQ
標(biāo)記lambda表達(dá)式采用引用方式捕獲變量,但是沒有在函數(shù)范圍內(nèi)本地使用,或者通過引用方式傳遞給另外一個函數(shù)的情況。
注意:這是一個近似的規(guī)則,但是確實可以標(biāo)記出:通過很有可能被調(diào)用者保存的指針進(jìn)行的傳遞,對通過參數(shù)訪問的堆上的某處進(jìn)行的寫入,返回lambda表達(dá)式等等。生命周期準(zhǔn)則群組也會提供標(biāo)記逃逸指針和參照的普遍準(zhǔn)則,也會包含源自lambda表達(dá)式的情況。
上述內(nèi)容就是如何在lambda表達(dá)式中使用引用形式捕捉局部變量,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。