辅助函数:lambda与普通函数

时间:2016-09-27 16:48:21

标签: c++ performance c++11 lambda

我有一个函数,它在内部使用一些辅助函数来保持它的正常组织和清洁。它们非常简单(但并不总是很短)(它们不仅仅是2个),而且可以很容易地在函数体内内联,但我不想自己这么做,因为正如我所说的,我想要保持该功能的组织有序。

所有这些函数都需要通过引用传递一些参数并修改它们,我可以用两种方式编写它们(只是一个愚蠢的例子):

使用正常功能:

void helperf1(int &count, int &count2) {
    count += 1;
    count2 += 2;
}

int helperf2 (int &count, int &count2) {
    return (count++) * (count2--);
}

//actual, important function
void myfunc(...) {
    int count = count2 = 0;

    while (...) {
        helperf1(count, count2);
        printf("%d\n", helperf2(count, count2));
    }
}

或者使用lambda函数捕获我在上面的示例中明确传递的参数:

void myfunc(...) {
    int count = count2 = 0;

    auto helperf1 = [&count, &count2] () -> void {
        count += 1;
        count2 += 2;
    };

    auto helperf2 = [&count, &count2] () -> int {
        return (count++) * (count2--);
    };

    while (...) {
        helperf1();
        printf("%d\n", helperf2());
    }
}

但是,我不确定我应该使用什么方法。对于第一个,一个,有传递参数的“开销”(我认为),而第二个那些参数可能(是它们?)已经包含在那里,以便删除“开销”。但它们仍然是lambda函数,应该(我认为,再次)不如普通函数快。

那我该怎么办?使用第一种方法?使用第二个?或者牺牲可读性并将它们内联到主函数的主体中?

3 个答案:

答案 0 :(得分:1)

您的首要关注应该是可读性(和可维护性)! 常规或lambda函数中哪一个更具可读性取决于给定的问题(以及读者/维护者的品味)。

在您发现性能实际是一个问题之前,请不要担心性能!如果性能 是一个问题,那么从基准测试开始,而不是猜测你认为哪个实现更快(在许多情况下编译器非常擅长优化)。

答案 1 :(得分:0)

性能方面,这里没有真正的问题。什么都没有决定,选择什么。

但是,Lambda的表达对你想要的目的没有任何好处。 他们不会让代码更清洁。

事实上,我认为与具有这些辅助函数的好的计算器对象相比,它们会使代码更难阅读,因为成员函数正确地用干净的语义和接口命名。

答案 2 :(得分:0)

使用Lambda更具可读性,但它们实际上存在的原因更为严重,Lambda表达式也称为“匿名函数”,在某些编程范例中非常有用,特别是函数式编程,即lambda演算({{3} })

在这里你可以找到使用lambdas的目标:
http://en.wikipedia.org/wiki/Lambda_calculus

如果你不需要在代码中的其他地方使用两个辅助函数,那么使用你的lambda方法,但是如果你在项目的某个地方再次调用其中一个函数避免每次都将它们写成lambda,你可以创建一个标题文件名为“helpers。(h / hpp)”&一个名为“helper。(c / cpp)”的源文件,然后在那里附加所有帮助函数,然后你获得辅助文件和调用者文件的可读性

你可以避免这种不熟练的习惯,并通过编写复杂的代码来挑战自己,每次你想要编辑它时,你会多次阅读它,这会增加你的编程技巧,如果你在团队中工作,它会赢得'是一个问题,使用注释,这将使他们更多地尊重您的编程技巧(如果您的复杂代码正在执行预期的行为并给出预期的输出)

在您发现自己编写性能关键算法之前不要担心性能,如果没有,差异将在几毫秒内,并且用户不会注意到它,因此您将失去时间进行优化如果你要求他优化你的代码,编译器可以在大多数时间单独完成。