Jac*_*ack 9 c++ lambda reference c++11
在C++ 11函数中使用一些本地lambda对象时,我很想将它们声明为const static auto lambda = ...让编译器知道只std::function需要一个对象(并且可能优化调用和/或内联它)但我意识到捕获在这种情况下通过引用的本地值导致奇怪的行为.
请考虑以下代码:
void process(const Data& data, const std::function<void(DataElement&>& lambda) {
...
}
void SomeClass::doSomething()
{
int foo = 0;
const static auto lambda = [&foo] () { .... ++foo; .... }
process(data, lambda);
}
Run Code Online (Sandbox Code Playgroud)
这不适用于多次调用,doSomething()但机制尚不清楚.
foo在第一次调用时绑定,然后绑定到堆栈地址,该地址在连续调用时变为无效?static在这种情况下,我被迫如此堕落吗?标准中指定了这种行为在哪里?考虑到它是一个static变量在哪里构建?懒惰第一次调用doSomething()(以便第一次调用工作)或在程序启动时?
Rei*_*ica 13
当控制流首次到达其声明时,静态函数范围变量被"懒惰地"初始化.这意味着通过引用捕获确实绑定到foo当前堆栈,并且当调用终止时,该绑定变为悬空.
不要试图过多地帮助编译器; 制作lambda static看起来像微优化,副作用非常严重.在实际创建闭包对象时,没有任何开销,编译器可以轻松地内联它,无论它是否static存在.
更不用说std::function即使你的方法,你也没有节省创建对象的事实.lambda表达式的类型是一个未命名的闭包对象,而不是 std::function.所以即使lambda是static,std::function反正也会在每个调用中创建对象(除非整个内容都是内联的).