在堆栈上定义大型数组或对象有什么缺点(如果有的话)?请看以下示例:
int doStuff() {
int poolOfObjects[1500];
// do stuff with the pool
return 0;
}
这有什么性能问题吗?我听说过堆栈溢出问题,但我假设这个数组不够大。
答案 0 :(得分:11)
堆栈溢出是一个问题,如果
数组大于线程堆栈
调用树非常深,或者
该函数使用递归
在所有其他情况下,堆栈分配是获取内存的一种非常快速有效的方法。但是,调用大量构造函数和析构函数可能会很慢,因此如果构造函数/析构函数不重要,您可能需要查看寿命较长的池。
答案 1 :(得分:5)
正如您所提到的,超越堆栈是主要问题。即使您的特定情况不是很大,也要考虑如果函数是递归的,会发生什么。
更糟糕的是,如果从递归函数调用函数,它可能会内联 - 从而导致“意外”堆栈溢出问题。 (我使用英特尔编译器多次遇到此问题。)
就性能问题而言,这些比测量更好。但是如果堆栈中存在非常大的数组,则可能会损坏数据局部性,如果它将其他变量分开的话。
除此之外,堆栈分配比堆分配更便宜且更快。在某些编译器(如MSVC)上,使用超过4k的堆栈将使编译器生成缓冲区安全检查。 (但它可以被禁用。)
答案 2 :(得分:1)
https://github.com/kennethlaskoski/SubtleBug
此代码包含一个我称之为微妙的错误,因为二进制文件在iOS模拟器上运行完美,并在真实设备上可耻地崩溃。 Spoiler ahead:由于分配了一个非常大的变量,在真实设备上发生的是经典的堆栈溢出。 模拟器使用更大的x86堆栈,所以一切顺利。 http://en.wikipedia.org/wiki/Stack_overflow#Very_large_stack_variables
答案 3 :(得分:0)
堆栈溢出问题应该是您的主要技术问题,但如果其他人会使用此代码,请仔细考虑1500的魔法大小是否会破坏某人对此功能的使用。