Fortran Coder

查看: 8460|回复: 1
打印 上一主题 下一主题

[讨论] 在普通的计算中,还有必要用动态数组来节省内存吗

[复制链接]

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
跳转到指定楼层
楼主
发表于 2014-11-13 18:58:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
记得读研的时候老师给我讲他用F77开发水力模型的时候是如何处理动态数组的问题的。
由于f77没有allocate,为了节省内存并且方便调节,他们那个时候的方法是定义一个比较大的一维数组val(Nmax),然后再在计算的时候,将这个一维数组进行分段,比如说val(10000~20000)之间存储水平速度,val(10001~30001)之间存储竖直速度之类的。经过一次试算之后可以得出内存的利用率。然后调节Nmax,达到省内存的目的。
不得不说这种方法确实很巧妙,老师那套程序内存利用率基本在98%左右的,但是这样做让他的代码几乎变成了天书。在当年那个内存比程序员要贵的年代,这样做确实能够做到只用调节那么几个参数就能定义全部数组的边界的难题。如今有allocate了,定义一个动态数组分分钟的事。
然后在今天我在修改一个2次元水质模型,发现原作者并没有使用动态数组来操作,而是直接用了一个比较大的数来定义数组的边界。顿时心生反感。如此不优雅的写法简直不能忍。然后看了看原作者设定的参数,确实一般的情况基本已经涵盖到了。只要不碰到逗比的case完全能满足绝大部分的计算。
然后我就在想,到底是我太矫情了还是省内存有其他的好处?看了看汇编的讲解,数据全部在寄存器中,按照相同的顺序读取某个数组,那么边界对速度完全没有影响。这样的话,除非是某些大型的计算需要考虑使用动态数组,一般的计算直接定义一个大一点的边界妥妥的。还有必要坚持对待内存能省则省的原则吗?



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

736

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
700 元
贡献
359 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2014-11-13 19:25:02 | 只看该作者
从执行的角度来说:
1.动态数组与静态数组基本没有区别,除了存储位置可能不同。(后者通常在静态data区,前者通常在Heap里)
2.数组的边界不影响程序使用。甚至,动态数组因为分配时需要向操作系统申请,反而会稍慢一些。

从其他的角度来说,动态数组有这些好处:
1.省内存,这是你所说的。在内存足够的情况下,为什么要省内存?原因在于,计算机不是只执行你一个程序(现在的操作系统都是多任务的了吧?),另外,你当前的程序可能足够,但如果将来会扩展程序呢?或者把多个程序组合在一起呢?内存就不一定能满足你的要求了。
2.动态数组不占用堆栈。堆栈是一块特殊的内存,在某些编译器上会被静态局部数组使用。造成堆栈溢出(Stack overflow),而动态数组不会。
3.可回收。如果程序中多个模块都需要大数组,但它们并不会同时执行,那么就可通过回收动态数组来最大化使用内存(函数中的局部动态数组在返回时会自动回收!)。反之,静态数组如果定义多个,都需要很大,则每一个可使用的资源就少了。
4.使代码易于阅读,易于扩展。适合于良好习惯的养成。.
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-23 09:35

Powered by Tencent X3.4

© 2013-2024 Tencent

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