游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3778|回复: 3

[原创] EXCEL使用心得之栈和堆的使用

[复制链接]

12

主题

41

帖子

236

积分

中级会员

Rank: 3Rank: 3

积分
236
QQ
发表于 2014-3-14 14:25:44 | 显示全部楼层 |阅读模式
一般数值策划在使用EXCEL时,会不好理解什么时候使用堆、什么时候使用栈,下面我来讲一些自己的使用心得

1、静态区,栈空间,堆空间
EXCEL把内存分为3个区域
静态区是始终存在的
栈空间随函数运行而先进后出
堆空间自己定义多少就多少

2、变量,结构体,类的对象
一般我们定义的一个数值,都是单个变量,他可以在静态区或者栈空间
我们定义的结构体,是一组不同类型的变量,他也在栈空间
而类的实体对象,存在于堆空间

3、对象,控件,容器
一般对象是一个类的实体,也就是NEW了以后的那个,他内部的变量叫属性,他内部的函数叫方法
控件是这个对象自带的功能,例如按钮等
容器是可以存放这些控件的另一种控件,例如窗体等

4、定义,声明,创建
例如我们定义一个结构体,定义一个类,这个叫定义
声明,声明变量,声明对象,都在静态区或者栈空间里
而只有创建了对象,才会在堆空间里

5、溢出,泄漏,跑飞
如果2个函数A和B互相调用,函数在栈空间里无限展开,就会栈被顶满了,一旦溢出EXCEL会崩溃
而泄漏则是由于逻辑问题,反复NEW了而没DEL,缓慢的越运行堆空间越满,顶满了以后EXCEL再崩溃
跑飞则是读写了不存在的内存,例如读写了内存中不存在的地址,也会直接崩溃

6、栈和堆的效率
单次计算看,栈比堆速度快,但整体框架设计看,因为函数内的变量会展开,需要先进后出
所以如果是反复使用某一块固定内存的话,还是传递堆的地址,比拷贝栈的内存,效率更好

7、为什么地址会无效
解答之前的问题
例如声明对象时,他在静态区或者栈上,标记了堆的地址,而没实际分配内存
当NEW了以后,开辟内存,DEL了以后删除内存,但不删除标记的地址
所以虽然这时还能获取地址,但地址是无效的

8、数据如何管理
常用的,常驻内存的,比较小的数据,放静态区,例如标志位等
不常用的,常驻内存的,比较大的数据,放堆里,例如BUFFER等
常用的,不常驻内存的,比较小的,放栈里,例如随函数生存周期的中间变量
常用的,不常驻内存的,又比较大的,只能放堆里了,也就是需要反复NEW和DEL的,但是要尽量避免出现这样的情况
例如可以如下解决

9、算法如何考虑
承上启下解答上面的问题
前面3种数据都好解决,那么第4个情况如何处理那
可以考虑,作为存储对象类的数据,放堆里,尽量空间复杂度换取时间复杂度
而局部密集计算类的属性,放结构体里,在栈里,尽量时间复杂度换取空间复杂度
例如每次从堆里取一条数据,在函数内的栈里运行完,再拷贝回堆里

10、举个生活中的例子
整个EXCEL的内存,就像一个水池子
这个水池子,就是堆
你的每个函数的栈就是一个勺子,每次用勺子从水池里摇一勺水,处理完再放回水池去
这样我们就可以把内存当水池一样管理了,让你的EXCEL效率飞升

作者本人是一名在多家上市公司工作过,有6年经验的数值策划,大家有兴趣可以加我QQ65167201,欢迎一起讨论EXCEL问题

46

主题

1586

帖子

3523

积分

论坛元老

【游戏哲学大师】

Rank: 8Rank: 8

积分
3523
QQ
发表于 2014-3-14 15:06:46 | 显示全部楼层
好高端 求指教~!!

0

主题

66

帖子

387

积分

中级会员

Rank: 3Rank: 3

积分
387
发表于 2014-3-20 16:34:16 | 显示全部楼层
挺好的。顶。

1

主题

107

帖子

383

积分

中级会员

Rank: 3Rank: 3

积分
383
发表于 2014-3-22 13:46:25 | 显示全部楼层
高大上的节奏呢...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-25 10:40

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表