C++ 函子与码分解
假设我有如下代码:C++ 函子与码分解,c++,performance,lambda,C++,Performance,Lambda,假设我有如下代码: void doTasksAndStuff() { // Do stuff ... // Do task ... // Do stuff ... // Do same task ... // Do stuff ... } void doTasksAndStuff() { auto doTask = []() { // Do task ...
void doTasksAndStuff()
{
// Do stuff
...
// Do task
...
// Do stuff
...
// Do same task
...
// Do stuff
...
}
void doTasksAndStuff()
{
auto doTask = []()
{
// Do task
...
};
// Do stuff
...
doTask();
// Do stuff
...
doTask();
// Do stuff
...
}
由于任务完成了两次,我认为最好考虑相应的代码:
void doTask()
{
// Do task
...
}
void doTasksAndStuff()
{
// Do stuff
...
doTask();
// Do stuff
...
doTask();
// Do stuff
...
}
现在,如果我这样写会怎么样:
void doTasksAndStuff()
{
// Do stuff
...
// Do task
...
// Do stuff
...
// Do same task
...
// Do stuff
...
}
void doTasksAndStuff()
{
auto doTask = []()
{
// Do task
...
};
// Do stuff
...
doTask();
// Do stuff
...
doTask();
// Do stuff
...
}
由于doTask()仅在函数doTasksAndStuff()中调用,因此在我看来,这是一种在不污染任何命名空间的情况下分解代码的干净方法,但这是这两种分解方法之间的唯一区别吗
特别是,性能如何?内联呢?性能应该差不多。lambdas的最大优点(和区别)是可以在闭包中捕获局部变量。如果您将其作为命名函数来执行,那么您必须传递任务中使用的所有局部变量
请注意,另一种方法是使用局部结构,您可以将其视为穷人的lambda。性能损失将取决于lambda函数是否将任何变量复制到自身中。谢谢您的回答,但我的问题更多的是关于函子,而不是关于lambda。如果没有捕获局部变量,编译器是否能够将代码内联到函子中?如果捕获了局部变量,答案是否会改变?Q1:是,请参见此:。问题2:只不过是使用一个单独的函数。