Adi*_*una 12 c c++ arrays memory-management
int A[10000000]; //This gives a segmentation fault
int *A = (int*)malloc(10000000*sizeof(int));//goes without any set fault.
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,出于好奇,如果最终我们能够为我们的数据结构分配更高的空间,例如,在C中使用指针方法创建的BST和链接列表没有这样的内存限制(除非总数大小超过我们机器的RAM大小),例如,在声明指针类型的上面的第二个语句中,为什么我们不能声明一个更大的数组(直到达到内存限制!!). ..这是因为分配的空间在静态大小的数组中是连续的吗?但是从那里我们得到保证,在RAM的下一个1000000字中没有其他代码将运行...?
PS:我在一些陈述中可能错了.在这种情况下请正确.
AnT*_*AnT 21
首先,在具有虚拟内存(Linux,Windows等)的典型现代操作系统中,RAM的数量没有任何区别.您的程序正在使用虚拟内存,而不是RAM.RAM只是虚拟内存访问的缓存.最大阵列大小的绝对限制因素不是RAM,而是可用地址空间的大小.地址空间是您在具有虚拟内存的操作系统中必须担心的资源.在32位操作系统中,您有4千兆字节的地址空间,其中一部分用于满足各种家庭需求,其余部分可供您使用.在64位操作系统中,理论上你有16艾字节的地址空间(少于实际实现中的地址空间,因为CPU通常使用少于64位来表示地址),这可以被视为几乎无限制.
其次,典型C/C++实现中的可用地址空间量取决于内存类型.有静态内存,有自动内存,还有动态内存.每种存储器类型的地址空间限制由编译器预先预先设置.这提出了一个问题:你在哪里声明你的大阵列?哪种内存类型?自动?静态的?您没有提供任何信息,但这绝对是必要的.如果您尝试将其声明为局部变量(自动内存),那么难怪它不起作用,因为自动内存(也称为"堆栈内存")分配给它的地址空间非常有限.你的阵列根本不合适.同时,malloc分配动态内存,通常具有最大可用的地址空间量.
第三,许多编译器为您提供控制不同类型内存之间地址空间初始分配的选项.您可以通过操作此类选项为程序请求更大的堆栈大小.很可能你可以请求堆栈这么大,比你的本地数组适合它没有任何问题.但实际上,由于显而易见的原因,将大型数组声明为局部变量是没有意义的.
假设局部变量,这是因为在现代实现中,将在堆栈上分配自动变量,其空间非常有限.此链接提供了一些常见的堆栈大小:
platform default size
=====================================
SunOS/Solaris 8172K bytes
Linux 8172K bytes
Windows 1024K bytes
cygwin 2048K bytes
Run Code Online (Sandbox Code Playgroud)
链接的文章还指出,例如在Linux中可以更改堆栈大小,在运行您的流程之前,一种可能的方式来自shell:
ulimit -s 32768#将堆栈大小设置为32M字节
虽然现代实现中的malloc将来自堆,但仅限于您可用于该进程的内存,并且在许多情况下,由于过度使用,您甚至可以分配超过可用内存的内存.