免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 7490 | 回复: 20
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-08-10 17:07 |只看该作者 |正序浏览
各位老大,如果我想定义两个4M的数组,该加什么编译选项呢??在linux中定义的数组最大是多少呢。而不是用malloc。

如我想定义:
Msg[4*1024*1024];
TmpMsg[4*1024*1024];

论坛徽章:
0
21 [报告]
发表于 2006-08-13 16:46 |只看该作者
我们的程序是这样的:频繁地生成从2M-4M大小的数据包,超过的或者小于的都是非法的,丢掉。如果符合条件将此数据包交由中间件传输。我觉得我们的情况和 yeajchao 兄的情况很相似。这中间的平台包括Windows,Linux,Aix.在程序的编译过程中总是出现因为栈空间不够用而出错的。在Windows平台上我们是知道是如何处理这种情况的。在linx和Aix上我们不知道如何处理,所以才有了上面的疑问。

现在终于知道了在Unix平台下如何处理了。我结合从网上找到的资料和namtso 兄的帮助,把我的总结发上来,感谢大家的帮助!!!!


如果数组定义成局部变量非静态变量,那么数组就会在栈上分配,当数组超过默认栈的大小时,会引起非常内存访问。
如果数组定义成全局变量或者局部静态变量,并且不初始化,数组在.bss段中分配,当程序加载时,由操作系统来完成。
如果数组太大,会造成程序无法加载,视系统不同,可能没有任何提示,也有可能提示内存空间不足。
如果数组定义成全局变量或者局部静态变量,并且初始化,数组在.data段中,由链接程序分配空间,当程序加载时,操作系统直接加载映像到内存或者使用内存映射技术。
如果数组太大,会造成程序无法加载,视系统不同,可能没有任何提示,也有可能提示内存空间不足。

不同平台的默认栈的大小如下:
platform                                                        default size       
===============================================================
        SunOS/Solaris                                8172K bytes                (Shared Version)
        Linux                                                         8172K bytes       
        Windows                                                        1024K bytes                (Release Version)
        cygwin                                                        2048K bytes       
       
       
        数组定义成局部变量非静态变量,那么数组就会在栈上分配,当数组超过默认栈的大小时,会引起非常内存访问。那么如何修改系统默认的栈的大小
        呢。
        一般说来,在Unix-like平台,栈的大小不是由程序自己来控制的而是由环境变量来控制的,所以就不能通过设置编译器(像gcc)的任何编译标志来设置栈的大小;
         
在windows平台下,栈的大小的信息是包含在可执行文件中的。它可以在Visual C++的编译过程中设置,但是在gcc中是不可行的。
也可以用Microsoft提供的一个叫作:”editbin.exe“程序来直接修改可执行文件的栈的大小。
       
        下面给出一些更详细的资料:
       
       
        SunOS/Solaris:
==============
        > limit                         # shows the current stack size
        > unlimit                 # changes the stack size to unlimited
        > setenv STACKSIZE 32768 # limits the stack size to 32M bytes
       
        Linux:
======
        > ulimit -a                # shows the current stack size
        > ulimit -s 32768        # sets the stack size to 32M bytes

Windows (在编译过程中的设置):
=============================
        1. Select "Project->Setting".
        2. Select "Link" page.
        3. Select "Category" to "Output".
        4. Type your preferred stack size in "Reserve:" field under "Stack
           allocations". eg, 32768 in decimal or 0x20000 in hexadecimal.

Windows (修改可执行文件):
=======================================
There are two programs included in Microsoft Visual Studio, "dumpbin.exe"
and "editbin.exe".  Run "dumpbin /headers executable_file", and you can see
the "size of stack reserve" information in "optional header values".  Run
"editbin /STACK:size" to change the default stack size.

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

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



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

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

所以,我觉得我那样处理还是蛮合算的

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



硬件资源不是问题,随着时间的推移,资源代价会越来越小,君不见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
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
16 [报告]
发表于 2006-08-12 21:16 |只看该作者
内存是珍贵的资源,既然,静态大数组和malloc() 大内存都有可能因内存不足而导致失败,那么为什么不用malloc() 呢?
要暂时解决问题,扩展内存咯~ 就 windows 系统一样,要不断扩展内存以满足新windows 的需求

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

回复 14楼 namtso 的帖子

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

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

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

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

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

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP