【发布时间】:2018-07-26 00:20:36
【问题描述】:
我查看了std::find_if on cppreference.com, 的各种签名,我注意到采用谓词函数的风格似乎按值接受它:
template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last,
UnaryPredicate p );
如果我对它们的理解正确,带有捕获变量的 lambda 会为其数据的引用或副本分配存储空间,因此“按值传递”可能意味着为调用复制捕获数据的副本。
另一方面,对于函数指针和其他可直接寻址的东西,如果直接传递函数指针,而不是通过引用到指针(pointer-to-pointer),性能应该会更好。
首先,这是正确的吗?上面的UnaryPredicate 会是按值参数吗?
其次,我对传递 lambda 的理解是否正确?
第三,在这种情况下是否有理由通过值而不是引用传递?更重要的是,是否没有一些足够模糊的语法(你好,通用引用)可以让编译器做任何它想要获得最大性能的事情?
【问题讨论】:
-
如果要存储谓词的副本,按引用传递可能不如按值传递最佳。但是你问的是传递,还是存储?
-
@juanchopanza 我认为这个问题是关于一般效率的,所以你可以推出你的答案。
标签: c++ pass-by-value stl-algorithm c++17