C++ 嵌套Lambda函数-性能影响

C++ 嵌套Lambda函数-性能影响,c++,c++11,asynchronous,lambda,c++14,C++,C++11,Asynchronous,Lambda,C++14,我有一个顶级lambda函数,然后在这个lambda中有两个嵌套的lambda函数 将lambda嵌套在其他lambda中是一个好主意吗?是否存在任何性能影响 例如 auto Multiplier1 = []() -> int { auto Multiplier2 = [](int i) -> int { auto Multiplier3 = [](int i) -> int { return i * 2;

我有一个顶级lambda函数,然后在这个lambda中有两个嵌套的lambda函数

将lambda嵌套在其他lambda中是一个好主意吗?是否存在任何性能影响

例如

auto Multiplier1 = []() -> int
{
    auto Multiplier2 = [](int i) -> int
    {
        auto Multiplier3 = [](int i) -> int
        {
            return i * 2;
        };
        std::cout << "Calling another lambda 2\n";
        return Multiplier3(i * 100);
    };

    int i = 10;
    std::cout << "Calling another lambda 1\n";
    int ret = Multiplier2(i);
    return ret;
};

int ret = Multiplier1();
std::cout << ret << "\n";
自动乘法器1=[]()->int
{
自动乘法器2=[](int i)->int
{
自动倍增器3=[](int i)->int
{
返回i*2;
};

std::cout询问编码风格表达对性能的影响始终是错误的问题

在优化时,编译器会考虑表达的意图,而不是代码的布局

这个例子很极端,但值得向您展示gcc使用编译器选项
-O2
生成的代码

重构上述代码以消除使用
cout
产生的噪音:

auto Multiplier1 = []() -> int
{
    auto Multiplier2 = [](int i) -> int
    {
        auto Multiplier3 = [](int i) -> int
        {
            return i * 2;
        };
        return Multiplier3(i * 100);
    };

    int i = 10;
    int ret = Multiplier2(i);
    return ret;
};

extern void emit(int);

int main()
{
    int ret = Multiplier1();
    emit(ret);
}
使用gcc-S-O2-std=c++14编译产生:

main:
        subq    $8, %rsp
        movl    $2000, %edi
        call    emit(int)
        xorl    %eax, %eax
        addq    $8, %rsp
        ret
请注意,乐观主义者已经看透了所有代码,并意识到该代码可以采取的唯一行动(重要的)是调用参数值为2000的函数
emit


经验教训始终是,人们应该优雅地表达意图(即,以一种易于理解和维护的方式),并允许编译器以最少的时间和/或代码大小发出实现该意图的代码。

“是否存在任何性能影响?”对于captureless Lambda,正如你所做的,绝对不是。诚实的问题:为什么不围绕你所拥有的罐装示例进行循环并计时。然后重构并计时?正如@ildjarn指出的,你需要确保这些Lambda的签名与你在生产中拥有的真实Lambda完全相同。@Hal你是对的。最好的办法是输入ime并检查性能。