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

Rya*_*yan 5 c++ memory arrays stack program-entry-point

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

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

或者作为全局变量的"主"范围:

int arr[10000000];     //on BSS, sie can be very large
int main{
    ....
}
Run Code Online (Sandbox Code Playgroud)

但我想要更多这个问题.

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

zer*_*tyz 1

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

ulimit -a
Run Code Online (Sandbox Code Playgroud)

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

stack size              (kbytes, -s) 8192
Run Code Online (Sandbox Code Playgroud)

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

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
Run Code Online (Sandbox Code Playgroud)

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

cat /proc/cpuinfo
Run Code Online (Sandbox Code Playgroud)

在我的旧服务器上给出:

address sizes   : 36 bits physical, 48 bits virtual
Run Code Online (Sandbox Code Playgroud)