我注意到在项目中,我在很多地方使用了lambda表达式来捕获指针,但是并未使用它。它是否会导致某种开销,例如指针复制或由编译器进行优化?
void MyClass::SomeFunction()
{
...
grid->ForEachItem([this](const Item& item)
{
// Some code doesn't use this
}
}
Run Code Online (Sandbox Code Playgroud)
相同的问题专门用于通过引用捕获所有信息[&]
我个人建议不要捕获this未使用的捕获,但最肯定不是出于性能原因。
我将从关于性能的强制性注释开始:首先是为了提高可读性而编写代码。在分析并确定了实际问题之后,您可以考虑优化慢速代码的特定部分。当然,我不是在谈论算法复杂性,而是在进行微优化。
在lambda捕获的情况下,允许编译器实际上不捕获未使用的对象,即使它们是通过copy捕获的[=]。最重要的是,lambda主体对于编译器是完全可见的,再加上仿佛规则,基本上可以确保在启用了优化的现代编译器上,您不必担心性能问题。
但是,我建议您不要捕获不使用的内容的原因是为了使表达式易于理解和表达。如果lambda this为此目的使用或作为引用或指针的任何其他变量,则需要确保lambda不会超过其捕获的内容。例如,如果我看到一个捕获this并在方法之外返回的lambda ,我会非常紧张,请格外小心,以确保捕获的对象不会在调用lambda之前过期。并且即使这不是问题(例如,lambda不会在方法之外逸出),读者的简单困惑(“此lambda不应使用对象的状态,为什么要捕获它this呢?”)是足够有说服力的论点来避免它。
查看lambda的捕获列表时,您应该告诉何时可以安全调用它。如果lambda 捕获了未使用的引用或指针,则该lambda 位于。不要写说谎的lambda。
TLDR没有开销,但是出于可读性和表达性的原因,请不要这样做。
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |