Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将代码包装在立即调用的lambda表达式中是否存在性能差异?_C++_Lambda - Fatal编程技术网

C++ 将代码包装在立即调用的lambda表达式中是否存在性能差异?

C++ 将代码包装在立即调用的lambda表达式中是否存在性能差异?,c++,lambda,C++,Lambda,下面是一些代码: 空f { //东西 { //代码 } } 也可以使用lambdas而不是大括号以这样奇怪的方式编写: 空f { //同上 [&]{ //代码同上 }; } 两个版本之间会有性能差异吗 根据我的检查,使用优化编译时,生成的程序集在clang中没有区别,因此我假设不会有性能开销。但情况总是这样吗?性能很难衡量。然而,在这种情况下,对此进行推理仍然是合理的 每个lambda实际上都是自己的类,并实现了运算符。此类与在未命名命名空间中编写的类具有相同的特征。一些相关元素:它的可见性仅限

下面是一些代码:

空f { //东西 { //代码 } } 也可以使用lambdas而不是大括号以这样奇怪的方式编写:

空f { //同上 [&]{ //代码同上 }; } 两个版本之间会有性能差异吗


根据我的检查,使用优化编译时,生成的程序集在clang中没有区别,因此我假设不会有性能开销。但情况总是这样吗?

性能很难衡量。然而,在这种情况下,对此进行推理仍然是合理的

每个lambda实际上都是自己的类,并实现了运算符。此类与在未命名命名空间中编写的类具有相同的特征。一些相关元素:它的可见性仅限于.cpp文件并链接到它,不需要在.obj文件中公开函数指针

编译器对立即调用的lambda有什么不同之处?实际上没有太多:它可以防止内联。根据我的经验,这与未命名函数具有相同的行为:要么函数太大,要么被多次使用。最后一个可能是函数返回lambda的结果

如果函数太大,则可能是因为未调用函数的某些路径由于未内联而更快。 如果它被多次调用,它会将二进制文件放大两次以内联,这可能会降低它的速度

对我来说,更大的风险是,您使用lambda调用一些模板化函数,如std::sort,然后将该函数体复制到所有地方,从而使二进制文件膨胀。然而,由于之前这些都是模板,并且std::function以其可测量的性能影响而闻名,我认为不值得为此付出努力

也就是说,我到处都在用lambdas。我甚至提供了类模板,将它们作为性能关键代码中的成员。lambda被认为是零开销,但根据您使用它们的方式,您可能会发现程序中的流速度减慢的边缘情况

最后一条建议,即使在C++语言中,可读性也是很重要的。拥有大的lambda被认为是不可读的。我见过样式指南规则将其限制为5或10行。 立即调用的lambda有其用途,但是,对于您的示例来说,从读者的角度来看,这实际上只是开销


去量量!如果您有性能关键型代码,请编写一个用于连续监视的性能测试,并不时运行一个探查器,以查看花费的时间。

性能很难衡量。然而,在这种情况下,对此进行推理仍然是合理的

每个lambda实际上都是自己的类,并实现了运算符。此类与在未命名命名空间中编写的类具有相同的特征。一些相关元素:它的可见性仅限于.cpp文件并链接到它,不需要在.obj文件中公开函数指针

编译器对立即调用的lambda有什么不同之处?实际上没有太多:它可以防止内联。根据我的经验,这与未命名函数具有相同的行为:要么函数太大,要么被多次使用。最后一个可能是函数返回lambda的结果

如果函数太大,则可能是因为未调用函数的某些路径由于未内联而更快。 如果它被多次调用,它会将二进制文件放大两次以内联,这可能会降低它的速度

对我来说,更大的风险是,您使用lambda调用一些模板化函数,如std::sort,然后将该函数体复制到所有地方,从而使二进制文件膨胀。然而,由于之前这些都是模板,并且std::function以其可测量的性能影响而闻名,我认为不值得为此付出努力

也就是说,我到处都在用lambdas。我甚至提供了类模板,将它们作为性能关键代码中的成员。lambda被认为是零开销,但根据您使用它们的方式,您可能会发现程序中的流速度减慢的边缘情况

最后一条建议,即使在C++语言中,可读性也是很重要的。拥有大的lambda被认为是不可读的。我见过样式指南规则将其限制为5或10行。 立即调用的lambda有其用途,但是,对于您的示例来说,从读者的角度来看,这实际上只是开销


去量量!如果您有性能关键型代码,请编写一个性能测试以进行连续监视,并不时运行探查器以查看花费的时间。

通过测试一个短程序,两者似乎都可以编译为启用优化的完全相同的程序集。在没有优化的情况下,非常小的程序将其大小增加了25%-33%。我会假设这将是同样的结果
任何大小的程序。优化取决于具有“仿佛”规则的编译器,因此唯一可以确保的方法是测量目标编译器/标志。不清楚是什么阻止了您编译两个版本的代码、对每个版本进行基准测试以及轻松解决性能问题。这是一个你应该能够自己回答的问题。我知道它可能不是我的地方,但是考虑把你的用户名改为稍微短一些的东西。也许是奇皮,或者是卡普卢斯,或者是威尔。。再短一点:@scratte我在想这个。我的昵称象征着我对C++的感情的二元论。在某种程度上,这很容易。另一方面,这很难。一方面它很简单,另一方面它很奇怪。我希望有一天我能用鸵鸟做一个农场,我会很开心。从测试一个短程序开始,两个程序似乎都能编译成完全相同的程序集,并启用了优化。在没有优化的情况下,非常小的程序将其大小增加了25%-33%。我假设在任何大小的程序中都会有相同的结果。优化取决于使用“仿佛”规则的编译器,因此唯一可以确定的方法是测量目标编译器/标志。不清楚是什么阻止了您编译两个版本的代码、对每个版本进行基准测试以及轻松解决性能问题。这是一个你应该能够自己回答的问题。我知道它可能不是我的地方,但是考虑把你的用户名改为稍微短一些的东西。也许是奇皮,或者是卡普卢斯,或者是威尔。。再短一点:@scratte我在想这个。我的昵称象征着我对C++的感情的二元论。在某种程度上,这很容易。另一方面,这很难。一方面它很简单,另一方面它很奇怪。我希望有一天我能用鸵鸟做一个农场,我会很开心。