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

voi*_*ter 5 c++ performance stack

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

int doStuff() {
   int poolOfObjects[1500];
   // do stuff with the pool
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Ben*_*igt 11

堆栈溢出是一个问题,如果

  • 数组大于线程堆栈

  • 调用树很深,或者

  • 该函数使用递归

在所有其他情况下,堆栈分配是获取内存的一种非常快速有效的方法.但是,调用大量构造函数和析构函数可能会很慢,因此如果构造函数/析构函数不重要,您可能需要查看寿命较长的池.

  • 但请注意,stackoverflow.com永远不会是一个问题. (5认同)

Mys*_*ial 5

正如您所提到的,超越堆栈是主要问题.即使您的特定情况不是很大,也要考虑如果函数是递归的,会发生什么.

更糟糕的是,如果从递归函数调用函数,它可能会内联 - 从而导致"意外"堆栈溢出问题.(我在英特尔编译器中多次遇到过这个问题.)


就性能问题而言,这些比测量更好.但是如果它分离其他变量,那么在堆栈上有一个非常大的数组可能会损害数据局部性.

除此之外,堆栈分配比堆分配更便宜且更快.在某些编译器(如MSVC)上,使用超过4k的堆栈将使编译器生成缓冲区安全检查.(但它可以被禁用.)