• C++ lambda函数,效率也许不如想象的好


    C++ lambda函数,当函数参数用复制的方式捕获时,参数存放在哪里呢?

    开始以为在栈里,好像不对。

    带着这个疑问,写一段递归函数,将参数的地址打出来看看。

    参考代码如下:

    #include <stdio.h> 
    #include <functional> 
    
    void fun2( std::function<void()> callback ) { 
        (callback)(); 
    } 
    
    void fun1(int n) { 
        if(n <= 0) return; 
        printf("stack address = %p, ", &n); 
    
        fun2([n]() { 
            printf("capture address = %p\n", &n); 
            fun1(n - 1); 
        }); 
    } 
    
    int main() { 
        fun1(200); 
        return 0; 
    }

    (编译环境:mingw64, 版本x64-4.8.0-release-posix-seh-rev2)

    结果令人吃惊。以下为输出结果,注意捕获参数的地址,并不在程序的stack区域,

    并且地址还不总是连续的。

    很明显,lambda表达的复制捕获的参数,是动态分配出空间存放的。

    特别关注效率或动态分配的场合,还是小心为妙。现实很骨感。

    stack address = 000000000022F1E0, capture address = 00000000002F6D20
    stack address = 000000000022F0C0, capture address = 00000000002F6D40
    stack address = 000000000022EFA0, capture address = 00000000002F6D60
    stack address = 000000000022EE80, capture address = 00000000002F6D80
    stack address = 000000000022ED60, capture address = 00000000002F6DA0
    stack address = 000000000022EC40, capture address = 00000000002F6DC0
    stack address = 000000000022EB20, capture address = 00000000007A7810
    stack address = 000000000022EA00, capture address = 00000000007A7820
    stack address = 000000000022E8E0, capture address = 00000000007A7830
    stack address = 000000000022E7C0, capture address = 00000000007A7840
    

    (转载请标明:http://www.cnblogs.com/xhawk18/)

  • 相关阅读:
    hive.exec.parallel参数
    MySQL FEDERATED 提示
    mapreduce作业单元测试
    linux 更改mysql的数据库目录
    SQL Server 2008数据库邮件配置及应用
    mysql主键大小写不敏感的解决办法
    java遍历hashMap、hashSet、Hashtable
    Linux下命令行显示当前全路径方法
    通过SQL Server操作MySQL的步骤和方法
    Linux shell获取时间和时间间隔(ms级别)
  • 原文地址:https://www.cnblogs.com/xhawk18/p/3109481.html
Copyright © 2020-2023  润新知