如何找出堆栈内存中适合的数组大小

How to find out what size array fits in stack memory?

本文关键字:数组 何找出 堆栈 内存      更新时间:2023-10-16

我的印象是,在进行时

void stuff() {
    int arr[1000];
    //do some stuff
}

然后,根据数组的大小和CPU的限制,可以在堆内存或堆栈内存中分配数组。

我正在优化一个脚本,该脚本对一些计算进行了粗略的测试,由于估计的时间目前为几周,我希望尽可能减少,我认为在堆栈中放入尽可能多的样本数据会有所帮助。

有没有一种方法可以找出我可以声明的数组的大小?

典型的现代机器上的堆栈各不相同,但通常在5MB左右/以下。在嵌入式平台上,可能要少得多。一些平台允许为创建的线程的堆栈大小指定提示,但通常这些只是提示,并没有严格遵守。

此外,你放在堆栈上的对象有多大取决于当前堆栈的深度,你可以在堆栈的开头或接近它的结尾。你真的不能提前知道,我的意思是在编码时,也就是在何时何地指定堆栈数组的大小。在一个琐碎的例子中,您可以假设您将处于堆栈的开头,但在生产代码中,函数调用可能以难以预测的顺序和深度嵌套,如果它们依赖于用户输入,则甚至是不可能的。

我不知道是否有任何可移植的方法,但特定于平台的方法是将对象放在堆栈上,并测量其地址和堆栈末尾之间的差异,这将在运行时为您提供剩余的堆栈空间。

无论如何,如果你的意图是在堆栈上放置一个大对象,那么不使用堆内存分配并不会给你带来太多好处,内存分配带来的损失可以忽略不计,而且之后,从中访问数据的速度将与在堆栈上一样快,还有一个好处,那就是它将不依赖于有限的堆栈大小。

堆栈的目的不是存储程序的大容量数据,而是跟踪程序的核心结构,使其能够运行。永远不要将大容量数据放在堆栈上。由于这种意图,堆栈大小几乎总是不超过几兆字节,即使对于打算使用千兆字节ram内存的应用程序也是如此。