How memory is allocated for a variable declared outside vs inside main()
我注意到,在处理一些大型数组(如Double 1000 x 1000)时,如果我在main()中声明数组,程序就会耗尽内存,但如果我在main()之外声明数组,即使是对于更大的数组,也不会发生这种情况。有人能解释什么是区别吗?
当一个变量在一个函数中声明(在您的例子中,是
在所有函数之外定义的变量是静态分配的。它的生存期一直持续到程序终止。
这是与实施有关的问题。理论上,在一个与全局范围相同的函数中定义一个内存消耗变量是可能的。
但是在实践中,全局范围内的变量将在目标机器代码的数据段中声明,并且有更多的可用空间来分配。但是,在函数中通常会使用堆栈概念,这有一些局限性。
在大多数系统中,函数中声明的内存将进入堆栈,堆栈很小,可能溢出。但是,在
从技术上讲,函数内部声明的内存具有
在主内存之外声明的内存具有
有关存储持续时间的详细信息,请参阅此链接。
如果要在函数内声明大量内存,可以使用分配函数
如果它是一个函数的局部(
全局变量(它们具有静态存储)不会在堆栈或堆上分配,而是在一个数据段上分配,该数据段的大小在整个程序持续时间内保持不变。
请注意,一个进程有两个以上的内存区域,即堆栈和堆。它还有一个代码/文本段,一个用于程序中初始化静态变量的数据段,另一个称为BSS段的用于未初始化静态变量的数据段。有关更多信息,请参阅内存中程序的解剖。
当程序执行时,它将创建一个进程,该进程将占用内存中的固定内存大小。这个过程包含四个部分:数据部分、代码部分、堆和堆栈。在这四个部分中,数据和代码部分的大小是固定的,而堆栈(存储本地变量、静态数据)和堆(存储动态内存分配的数据)的大小在执行过程中会有所不同。现在,如果您在全局区域的主要方法之外声明变量,那么它将存储在流程的数据部分,该部分的大小是固定的。因此,在主机外部创建非常大的数组会导致数据段出现问题。如果您将它存储在main中,那么它的大小可以由堆栈管理。
您必须决定是从堆(决定动态分配数组)还是从堆栈(在某些函数中有一个局部变量,在不在作用域内时将被释放)、外部主内存将数据放入所有函数共享的全局地址空间、在主内存之前进行分配,并在以后进行释放。R MAIN完成(程序退出时)。
堆栈的大小约为2-3米,堆的大小与虚拟内存有关,可以非常大。你可以这样申报