这个问题可能听起来相当简单,但这是我与另一位与我合作的开发人员的辩论.
我正在小心处理堆栈分配的东西,而不是堆分配它们.他正在跟我说话,看着我的肩膀并评论说这没有必要,因为他们的表现是明智的.
我一直认为堆栈的增长是恒定的时间,并且堆分配的性能取决于堆的当前复杂性(用于找到合适大小的孔)和解除分配(折叠孔以减少碎片,如如果我没有弄错的话,许多标准库实现在删除期间需要时间来完成此操作.
这让我觉得可能非常依赖于编译器.特别是对于这个项目,我使用Metrowerks编译器来实现PPC架构.对这种组合的洞察力将是最有帮助的,但总的来说,对于GCC和MSVC++,情况如何?堆分配不如堆栈分配高吗?没有区别吗?或者差异是如此微小,它变得毫无意义的微优化.
让我们考虑以下两个代码
第一:
for (int i=0;i<10000000;i++)
{
char* tab = new char[500];
delete[] tab;
}
Run Code Online (Sandbox Code Playgroud)
第二:
for (int i=0;i<10000000;i++)
{
char tab[500];
}
Run Code Online (Sandbox Code Playgroud)
峰值内存使用率几乎相同,但第二个代码运行速度比第一个快20倍.
问题
是因为第一个代码数组存储在堆上,而第二个数组存储在堆栈中?