这是我的印象,这样做
void stuff() {
int arr[1000];
//do some stuff
}
然后可以在堆或堆栈内存中分配数组,具体取决于它的大小和CPU的限制。
我正在优化强制测试某些计算的脚本,并且因为估计的时间目前是几周,所以我希望尽可能地减少这种情况,尽可能多地获取样本数据我认为堆栈会有所帮助。
有没有办法找出我可以声明的数组有多大?
答案 0 :(得分:1)
典型现代机器上的堆栈各不相同,但通常大约/小于5 MB。在嵌入式平台上可能要少得多。某些平台允许为创建的线程的堆栈大小指定提示,但通常这些只是提示而不是严格遵循。
此外,您放置在堆栈上的大对象取决于当前堆栈深度,您可能位于堆栈的开头或接近其末尾。你无法提前告诉我,我的意思是编码时间,即指定堆栈数组大小的时间和地点。在一个简单的例子中,您可以假设您将处于堆栈的开头,但在生产代码中,函数调用可能嵌套在难以预测的顺序和深度中,如果它们依赖于用户输入,则甚至是不可能的。
我不知道是否有任何可移植方式,但特定于平台的方法是将一个对象放在堆栈上并测量其地址与堆栈末尾之间的差异,这将在运行时为您提供堆栈你离开的空间。
无论如何,如果你的意图是在堆栈上放置一个大对象,你不会因为不使用堆内存分配而获得太多收益,内存分配的代价可以忽略不计,之后访问来自它的数据将与堆栈中的数据一样快,增加的好处是它不依赖于有限的堆栈大小。
堆栈的目的不是存储程序的批量数据,而是跟踪程序的核心结构,以便它可以运行。不要将批量数据放在堆栈上。由于这个意图,堆栈大小几乎总是不超过几兆字节,即使对于打算使用千兆字节内存的应用程序也是如此。