C ++: Czy nieużywane jawne przechwytywanie lambda może zostać zoptymalizowane?
Mam przyzwoitą ilość kodu, który polega na przechwytywaniushared_from_this()
gdy używamy wyrażenia lambda jako wywołania zwrotnego, aby zapewnić, że moja instancja pozostanie aktywna:
std::shared_ptr<Thing> self = shared_from_this();
auto doSomething = [this, self] ()
{
// various statements, none of which reference self, but do use this
}
Więc pytanie brzmi: ponieważ nie odwołuję sięself
wewnątrz ciała lambda, czy zgodny kompilator pozwala zoptymalizować przechwytywanie?
Rozważmy następujący program:
#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;
}
Dane wyjściowe to:
1
2
To wskazuje, żeg++-4.7.1
nie optymalizuje przechwytywania (ani tego nie robi)clang-3.1
).