堆栈上或BSS或DATA段上的数组最大大小

时间:2016-04-15 01:08:47

标签: c++ arrays memory stack main

在C ++中,我们都知道数组可以作为局部变量位于“主”范围内:

int main(){
    int arr[10000];    //on the stack, size can't be very large
    ....
}

或作为全局变量的“主”范围:

int arr[10000000];     //on BSS, sie can be very large
int main{
    ....
}

但是我想要更多这个问题。

  1. 最大数组大小是多少?我的意思是确切的价值。
  2. 什么会限制最大大小,对于堆栈,我认为答案是创建线程时的堆栈。但是对于BSS,我真的不知道究竟是什么,限制它的大小,是否与线程(就像堆栈)或应用程序(如堆)相关联?

1 个答案:

答案 0 :(得分:0)

主线程的堆栈大小由操作系统在进程创建时分配。在Linux上,您可以使用命令'ulimit'进行检查和更改。要获取当前流程创建限制的列表:

ulimit -a

在我的Linux x64上,默认值为:

stack size              (kbytes, -s) 8192

如果您的程序创建了任何线程,则每个线程还将其堆栈大小设置为默认值(在linux / pthread上为2048k),您可以使用以下函数进行更改:

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);

对于BSS大小,限制是您的进程可以访问多少虚拟内存:在一台32位计算机上为1.5-2g,在64位计算机上为大约2 ^ b。请注意,“ b”不一定是64:

cat /proc/cpuinfo

在我的旧服务器上给出:

address sizes   : 36 bits physical, 48 bits virtual