有人告诉我不要使用堆栈分配的数组,因为堆栈是一种宝贵的资源。其他人建议我,只要数组相对较小,使用堆栈分配的数组是完全可以的。
我想要一个经验法则:什么情况下应该使用堆栈分配的数组?什么情况下应该使用堆分配的数组?
有人告诉我不要使用堆栈分配的数组,因为堆栈是一种宝贵的资源。其他人建议我,只要数组相对较小,使用堆栈分配的数组是完全可以的。
我想要一个经验法则:什么情况下应该使用堆栈分配的数组?什么情况下应该使用堆分配的数组?
尽管今天的RAM和虚拟内存具有巨大的容量,但是所有的内存都是有限制的。不过,与堆栈相比,它的限制相当大,堆栈在小型嵌入式系统上可能只有几kb,在PC上可能有几MB。
此外,还要考虑如何使用内存,以及用于什么目的。例如,如果您想从函数返回一个"数组",则它永远不应该在堆栈上。
通常情况下,如果可以的话,请尽量保持堆栈上的数组较小。如果您在堆栈上创建了一个有数千个条目的数组,您应该停下来思考一下它的用途。
char
数组的代码,甚至达到32kb,但我个人认为超过8k可能有点太多了。 - Some programmer dude这要看你使用的平台。
如今,如果在流行的x64平台上工作,你不必太担心这个问题。
根据你使用的操作系统,你可以查看用户空间进程允许使用多少堆栈空间和堆空间。
例如,类UNIX系统有软限制和硬限制。有些可以增加,有些则不行。
总的来说,你通常不需要担心这些事情。当你需要知道时,通常你会紧密地与你所开发的平台联系在一起,了解所有这些细节。
希望我回答了你的问题。如果你想知道具体数值,请指定你的确切硬件、操作系统和用户权限。
一个简单的测试方法是在你的main
例程中插入大量堆栈空间的使用,以确定是否存在问题。如果你使用了额外的堆栈空间,并且你的应用程序在通常使用大量堆栈空间的负载下仍然正常运行,那么当你在main
中删除这个人为保留时,你将有足够的余量。
更好的方法是计算你的程序可能使用的最大值,并将其与系统可用的堆栈空间进行比较。但是,在今天的软件中很少有这样的简单方法。
如果你遇到了堆栈空间限制,你的链接器或操作系统可能有选项可以提供更多的空间。
全局变量和静态变量的作用域将贯穿整个进程的生命周期。这些变量的内存将在进程启动时分配,并且只有在进程退出时才会释放。
但是局部变量(堆栈变量)仅在定义它的函数中具有作用域。当调用函数时,将分配内存,并且一旦控制从函数中退出,内存将被释放。
动态内存的主要目的是创建用户定义范围的变量。如果您想控制变量的作用域,则可以在一个函数中为变量x
分配内存,然后将引用(地址)传递给您想要的许多函数,最后可以释放它。
因此,借助动态分配的内存,我们可以创建具有比局部变量更高作用域但比全局或静态变量更低的变量。
除此之外,如果大小非常大,最好使用动态内存,如果架构包含内存限制。
使用堆分配内存的好处是可以将其所有权传递给其他函数/结构。另一方面,栈为您提供了免费的内存管理,您不会忘记从栈中释放内存,而如果使用堆,则存在泄漏风险。
如果您仅为本地使用创建数组,则使用哪个大小的标准是很难确定的,但是当需要分配在堆上的内存超过几百字节时,就应该考虑使用堆。对于其他人来说,这个值可能更大或更小。