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

标签 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;
        };
        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";

在上面的示例中,我可以将 Multiplier2 和 Multiplier3 重构为单独的函数。与此相比,这是更好的方法吗?

我正在修改已经在生产中的代码,因此,我进退两难,是将其重构为单独的函数还是使用 lambda 函数进行管理。

最佳答案

由于编码风格的表达而询问性能影响总是错误的问题。

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

这个例子很极端,但值得向您展示 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

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

关于c++ - 嵌套 Lambda 函数 - 性能影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37475962/

相关文章:

c++ - 如何检查 std::next(x) 是否指向 C++ 中的有效地址?

C# 应用程序应该是异步的,但 UI 仍然卡住

python-3.x - python3 asyncio 等待回调

c++ - eclipse CDT : How to relink static libraries without Project Clean>>Project Rebuild

c++ - QSystemTrayIcon 消息显示时如何禁用或启用声音?

c++ - 函数参数评估顺序与 Lambda 捕获评估顺序

multithreading - C++11 异步段错误

c++ - 如何遍历一个Btree?

c++ - 在 std::any 的 std::vector 中找到一个元素

c# - 同步使用HttpClient的 "right way"是什么?