允许编译器消除按值捕获所需的副本吗?

vector<Image> movie1;
apply( [=movie1](){ return movie1.size(); } );
  • 是否有编译器不需要复制movie1的情况?
  • 也许编译器可以知道,apply实际上并没有改变movie1
  • 还是在任何情况下Lambda默认为const仿函数都有助于?
  • vector具有移动构造函数和移动分配功能是否完全有帮助?
  • 如果是,是否还需要将它们添加到Image中,以防止在此处复制昂贵的内容?
  • 与按值参数相比,按值捕获何时以及如何需要副本的机制是否有所不同?例如。 void operate(vector<Image> movie)
  • 最佳答案

    我敢肯定它不会。

    即使外部函数不再显式使用变量,移动变量也会改变销毁的语义。

    具有Image的移动构造函数无济于事,vector可以在不移动其元素的情况下moveswap

    如果从现在开始该变量是只读的,为什么不通过引用捕获呢?您甚至可以创建一个const引用并捕获它。

    如果变量不是只读的,则需要副本。外部函数或lambda是否执行修改都无关紧要,编译器无法允许其他人看到该修改。

    我看到按值捕获和按值参数传递之间的唯一区别是捕获是命名的,它不能是临时的。因此,无法使用适用于临时人员的参数传递优化。

    10-08 08:18