Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.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++ 函子与码分解_C++_Performance_Lambda - Fatal编程技术网

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:只不过是使用一个单独的函数。