簡體   English   中英

C ++:可以優化未使用的lambda顯式捕獲嗎?

[英]C++: Can an unused lambda explicit capture be optimized out?

當使用lambda表達式作為回調來確保我的實例保持活動時,我有相當數量的代碼依賴於捕獲shared_from_this()

std::shared_ptr<Thing> self = shared_from_this();
auto doSomething = [this, self] ()
{
    // various statements, none of which reference self, but do use this
}

所以問題是:由於我沒有在lambda體內引用self ,是否允許一致的編譯器優化捕獲?


考慮以下程序:

#include <functional>
#include <iostream>
#include <memory>

std::function<void ()> gFunc;

struct S : std::enable_shared_from_this<S>
{
    void putGlobal()
    {
        auto self = shared_from_this();
        gFunc = [self] { };
    }
};

int main()
{
    auto x = std::make_shared<S>();
    std::cout << x.use_count() << std::endl;
    x->putGlobal();
    std::cout << x.use_count() << std::endl;
}

輸出是:

1
2

這表明g++-4.7.1並沒有優化捕獲( clang-3.1也沒有)。

該標准保證捕獲的值不會被優化(根據§5.1.2/ 14):

如果隱式捕獲實體並且捕獲默認值為=,或者使用不包含&的捕獲顯式捕獲 實體,則通過副本捕獲實體 對於由副本捕獲的每個實體,在閉包類型中聲明未命名的非靜態數據成員。 這些成員的聲明順序未指定。 如果實體不是對對象的引用,則這種數據成員的類型是對應的捕獲實體的類型,否則是引用的類型。

因此,在評估時將self復制到閉包中(根據§5.1.2/ 21):

在計算lambda表達式時,復制捕獲的實體用於直接初始化生成的閉包對象的每個對應的非靜態數據成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM