在堆栈上使用大型变量/数组的缺点?

时间:2012-01-30 23:38:09

标签: c++ performance stack

在堆栈上定义大型数组或对象有什么缺点(如果有的话)?请看以下示例:

int doStuff() {
   int poolOfObjects[1500];
   // do stuff with the pool
   return 0;
}

这有什么性能问题吗?我听说过堆栈溢出问题,但我假设这个数组不够大。

4 个答案:

答案 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的魔法大小是否会破坏某人对此功能的使用。

相关问题