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
堆栈溢出是一个问题,如果
数组大于线程堆栈
调用树很深,或者
该函数使用递归
在所有其他情况下,堆栈分配是获取内存的一种非常快速有效的方法.但是,调用大量构造函数和析构函数可能会很慢,因此如果构造函数/析构函数不重要,您可能需要查看寿命较长的池.
正如您所提到的,超越堆栈是主要问题.即使您的特定情况不是很大,也要考虑如果函数是递归的,会发生什么.
更糟糕的是,如果从递归函数调用函数,它可能会内联 - 从而导致"意外"堆栈溢出问题.(我在英特尔编译器中多次遇到过这个问题.)
就性能问题而言,这些比测量更好.但是如果它分离其他变量,那么在堆栈上有一个非常大的数组可能会损害数据局部性.
除此之外,堆栈分配比堆分配更便宜且更快.在某些编译器(如MSVC)上,使用超过4k的堆栈将使编译器生成缓冲区安全检查.(但它可以被禁用.)