Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77552
  • 博文数量: 14
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 161
  • 用 户 组: 普通用户
  • 注册时间: 2014-01-03 12:32
文章分类

全部博文(14)

文章存档

2016年(1)

2015年(7)

2014年(6)

我的朋友

分类: LINUX

2015-09-30 21:08:12

    偶然看到闭包这个词,时间瞬间回到大学时,在3号楼,李院长给我们上离散数学,他讲的滔滔不绝,我们听得昏天暗地……

    在网上查了很多概念,表示看不懂,什么自由变量,什么词法上下文,哇哦~
    
    用自己的语言,结合网上各位的总结,给一个简单的对应C语言中的定义吧,闭包就是利用嵌套函数这种形式,对于自己作用域之外的变量进行操作,表现代码为

点击(此处)折叠或打开

  1. void* caller()
  2. {
  3.     int temp = 1314;
  4.     void callee() {
  5.         printf("%d\n", temp);
  6.     }
  7.     return test;
  8. }
    caller中嵌套定义了callee,同时,callee中读取了temp变量,一般,我说的是一般(嵌套定义合法时),callee是不能访问temp的,但是这就是闭包,当然,要完成闭包还有一步,就完成对于callee的调用

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. void* caller() {
  3.     int cnt = 0;
  4.     void callee() {
  5.         cnt++;
  6.         printf("%d\n", cnt);
  7.     }
  8.     return callee;
  9. }
  10. int main()
  11. {
  12.     void(*callee)(void) = caller();
  13.     callee();
  14.     return 0;
  15. }
    这样,就说callee是一个闭包。

    自己浅谈下闭包的实现吧(参考别人的思路),当调用闭包时,有一个调用链的关系,以上面的代码为例,就是,callee->caller->全局,直到找到cnt这个变量为止,所以说,需要保存许多信息,开销比较大。

    思考:
    1、首先,C中不能嵌套定义函数(GCC扩展好像可以),自己没有尝试,之前在一本什么hack的书中看过这种代码,这是把代码写到栈上,还有把代码写到堆上的呢,自己读书少哇~

    2、其次,闭包有什么用,什么?Lambda表达式?我读书少,你不要骗我。

    3、闭包和协程的关系,路过的大神,给个链接呗!


    欢迎拍砖!欢迎讨论!

    附上参考链接,代码都是盗人家的,不好意思~~~
     />      />      />     http://www.cnblogs.com/super-d2/archive/2012/06/12/2546236.html


    




    
阅读(7883) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~