C++ 辅助函数:lambdas与普通函数

C++ 辅助函数:lambdas与普通函数,c++,performance,c++11,lambda,C++,Performance,C++11,Lambda,我有一个函数,它在内部使用了一些助手函数来保持它的身体有条理和干净。它们非常简单(但并不总是很短)(它们不仅仅是2个),并且可以很容易地内联到函数体中,但我自己不想这样做,因为正如我所说的,我希望保持函数体的组织 所有这些函数都需要通过引用传递一些参数并进行修改,我可以用两种方式编写它们(只是一个愚蠢的示例): 具有正常功能: void helperf1(int &count, int &count2) { count += 1; count2 += 2; }

我有一个函数,它在内部使用了一些助手函数来保持它的身体有条理和干净。它们非常简单(但并不总是很短)(它们不仅仅是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函数,应该(我想,再次)不如普通函数快


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

您最关心的应该是可读性(和可维护性)! 哪一个常规函数或lambda函数更具可读性在很大程度上取决于给定的问题(还有一点取决于读取器/维护者的喜好)


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

从性能角度看,这里没有真正的问题。没什么可决定的,随便选吧

但是,Lambda表达式对于您想要的目的没有任何好处。 他们不会让代码变得更干净


事实上,我相信与一个漂亮的计算器对象相比,它们会使代码更难阅读,因为计算器对象将这些辅助函数作为成员函数,并使用干净的语义和接口正确命名。

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

在这里您可以找到使用lambdas的目标:

如果在代码的其他地方不需要这两个helper函数,那么使用lambda方法,但是如果要在项目中的某个地方再次调用其中一个函数,请避免每次都将其作为lambda写入,您可以创建名为“helpers.(h/hpp)”的头文件和名为“helper.(c/cpp)的源文件“然后在那里附加所有帮助程序函数,然后您就可以获得帮助程序文件和调用程序文件的可读性

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


在你发现自己编写了一个性能关键的算法之前,不要担心性能,否则,差异将在几毫秒内出现,用户不会注意到,因此你将在优化中浪费时间,如果你要求编译器优化你的代码,编译器大部分时间都可以自己完成优化。

tware
helperf1
helperf2
可能是内联的,因此不会产生开销。@Zereges也使用lambda版本?有人说过早优化?选择一个可读性更好的版本,这里可能根本没有性能差异(如果你是为了速度而构建的,它们将以相同的方式内联).可读性在某种程度上是一个自以为是的问题。也就是说,一般来说,将一个大方法分解为更小的部分的可读性原因是从较大的方法中删除代码;将lambdas与总体方法内联使用有点违背了这一目的……您希望助手方法成为函子还有其他原因(可能是lambdas)或常规方法,但就可读性而言,由您决定