免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: realliuxin
打印 上一主题 下一主题

求助 用gcc 编译的程序中,定义的数组最大是多少? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2006-08-11 12:58 |只看该作者
强烈同意flw.

有malloc吗。

下面是极其“恶劣”的程序

1) 定义巨大的全局ARRAY,并初始化一小部分
2)定义很大的局部ARRAY,比如



  1. func()
  2.   {
  3.     char string[8192] = "AFKSDLFAKLSFKLDAKLSKLFADKLKASDLFKLASFKLSADFKLAFSKLFASKDKFASD";
  4.     ....


  5.    }

复制代码

[ 本帖最后由 思一克 于 2006-8-11 13:00 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2006-08-11 13:01 |只看该作者
我曾经写过一个程序,内含有一个 10MB的全局数组
运行起来也没有关系啊
(solaris8)

论坛徽章:
0
13 [报告]
发表于 2006-08-11 13:03 |只看该作者
To yeajchao,

运行是没有关系。速度也可能不影响。但我们写程序还是要追求漂亮,追求不“恶劣”。

论坛徽章:
0
14 [报告]
发表于 2006-08-11 13:50 |只看该作者
如果数组定义成局部变量非静态变量,那么数组就会在栈上分配,当数组超过默认栈的大小时,会引起非常内存访问。
如果数组定义成全局变量或者局部静态变量,并且不初始化,数组在.bss段中分配,当程序加载时,由操作系统来完成。如果数组太大,会造成程序无法加载,视系统不同,可能没有任何提示,也有可能提示内存空间不足。如果数组定义成全局变量或者局部静态变量,并且初始化,数组在.data段中,由链接程序分配空间,当程序加载时,操作系统直接加载映像到内存或者使用内存映射技术。如果数组太大,会造成程序无法加载,视系统不同,可能没有任何提示,也有可能提示内存空间不足。

论坛徽章:
0
15 [报告]
发表于 2006-08-12 21:10 |只看该作者

回复 14楼 namtso 的帖子

回答的好,定义这么两个数组的原因不是malloc 不能用了,而是为了防止用malloc申请不到内存而造成程序在运行中退出。

之所以写的这么恶心是想在别人调用我们的接口的时候不会因为malloc不到内存而失败。

论坛徽章:
0
16 [报告]
发表于 2006-08-12 21:16 |只看该作者
内存是珍贵的资源,既然,静态大数组和malloc() 大内存都有可能因内存不足而导致失败,那么为什么不用malloc() 呢?
要暂时解决问题,扩展内存咯~ 就 windows 系统一样,要不断扩展内存以满足新windows 的需求

论坛徽章:
0
17 [报告]
发表于 2006-08-12 23:31 |只看该作者
原帖由 思一克 于 2006-8-11 12:58 发表
强烈同意flw.

有malloc吗。

下面是极其“恶劣”的程序

1) 定义巨大的全局ARRAY,并初始化一小部分
2)定义很大的局部ARRAY,比如

[CODE]

func()
  {
    char string[8192] = "AFKSDLFAK ...



硬件资源不是问题,随着时间的推移,资源代价会越来越小,君不见3年前pc的的内存普遍是256,现在是1G。
能不malloc就不malloc,能定义数组就尽量定义数组,这样不就可以避免内存泄露,可以把程序员从低级错误中解放出来了吗?
我觉得牺牲一点资源来换取程序的健壮性,是很划算的事情

论坛徽章:
0
18 [报告]
发表于 2006-08-13 10:28 |只看该作者
原帖由 realliuxin 于 2006-8-12 21:10 发表
回答的好,定义这么两个数组的原因不是malloc 不能用了,而是为了防止用malloc申请不到内存而造成程序在运行中退出。

之所以写的这么恶心是想在别人调用我们的接口的时候不会因为malloc不到内存而失败。


这种想法是要不得的, 应该尽量使用 malloc,
虽然你避免了malloc失败,但是占用了过多的 栈, 若程序复杂了,函数调用时可能栈空间不够, 要命的是每次运行时你死在哪里都不一定。

论坛徽章:
0
19 [报告]
发表于 2006-08-13 10:32 |只看该作者
原帖由 isnowran 于 2006-8-12 23:31 发表



硬件资源不是问题,随着时间的推移,资源代价会越来越小,君不见3年前pc的的内存普遍是256,现在是1G。
能不malloc就不malloc,能定义数组就尽量定义数组,这样不就可以避免内存泄露,可以把程序员从低级错 ...

毫无意义, 程序若一直在运行, 你的内存也一直占用了阿。

比较大的系统都应该尽量避免全局变量。

论坛徽章:
0
20 [报告]
发表于 2006-08-13 10:36 |只看该作者
原帖由 思一克 于 2006-8-11 13:03 发表
To yeajchao,

运行是没有关系。速度也可能不影响。但我们写程序还是要追求漂亮,追求不“恶劣”。



当时 ,我的程序的处理需求是这样的
频繁地读取 二进制文件,处理它 ,
处理完了 读取 下一个二进制文件

我的程序就是循环的这样处理数据的
这些文件的大小不超过 10MB,(超过 10MB的 不予以处理)

所以,我觉得我那样处理还是蛮合算的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP