关于c ++:如何为main()内部声明的变量分配内存

How memory is allocated for a variable declared outside vs inside main()

我注意到,在处理一些大型数组(如Double 1000 x 1000)时,如果我在main()中声明数组,程序就会耗尽内存,但如果我在main()之外声明数组,即使是对于更大的数组,也不会发生这种情况。有人能解释什么是区别吗?


当一个变量在一个函数中声明(在您的例子中,是main)时,它被分配到堆栈上,如果它太大(例如,一个大数组),您将遇到堆栈溢出。

在所有函数之外定义的变量是静态分配的。它的生存期一直持续到程序终止。


这是与实施有关的问题。理论上,在一个与全局范围相同的函数中定义一个内存消耗变量是可能的。

但是在实践中,全局范围内的变量将在目标机器代码的数据段中声明,并且有更多的可用空间来分配。但是,在函数中通常会使用堆栈概念,这有一些局限性。


在大多数系统中,函数中声明的内存将进入堆栈,堆栈很小,可能溢出。但是,在main()之外声明的内存将不会。堆栈的大小(和存在性)是依赖于实现的——尽管我不知道堆栈不存在的任何常用的C++系统。

从技术上讲,函数内部声明的内存具有automatic存储持续时间,这意味着它是在封闭代码块的开头分配的,并且在代码块完成后无效。

在主内存之外声明的内存具有static存储期限,这意味着它是在程序启动时分配的,并且在程序的生命周期内有效。

有关存储持续时间的详细信息,请参阅此链接。

如果要在函数内声明大量内存,可以使用分配函数mallocnew。这个链接清楚地解释了堆栈和堆之间的区别(虽然它是C,而不是C++),但它仍然适用于C++。


如果它是一个函数的局部(main只是另一个函数),那么它将进入堆栈。1000x1000x8=800万字节。这可能大于堆栈大小。不同的编译器可能有不同的大小,但我认为默认值是1MB。

全局变量(它们具有静态存储)不会在堆栈或堆上分配,而是在一个数据段上分配,该数据段的大小在整个程序持续时间内保持不变。

请注意,一个进程有两个以上的内存区域,即堆栈和堆。它还有一个代码/文本段,一个用于程序中初始化静态变量的数据段,另一个称为BSS段的用于未初始化静态变量的数据段。有关更多信息,请参阅内存中程序的解剖。


当程序执行时,它将创建一个进程,该进程将占用内存中的固定内存大小。这个过程包含四个部分:数据部分、代码部分、堆和堆栈。在这四个部分中,数据和代码部分的大小是固定的,而堆栈(存储本地变量、静态数据)和堆(存储动态内存分配的数据)的大小在执行过程中会有所不同。现在,如果您在全局区域的主要方法之外声明变量,那么它将存储在流程的数据部分,该部分的大小是固定的。因此,在主机外部创建非常大的数组会导致数据段出现问题。如果您将它存储在main中,那么它的大小可以由堆栈管理。


您必须决定是从堆(决定动态分配数组)还是从堆栈(在某些函数中有一个局部变量,在不在作用域内时将被释放)、外部主内存将数据放入所有函数共享的全局地址空间、在主内存之前进行分配,并在以后进行释放。R MAIN完成(程序退出时)。


堆栈的大小约为2-3米,堆的大小与虚拟内存有关,可以非常大。你可以这样申报