哪个更快地访问堆栈或堆?

时间:2013-12-20 11:24:45

标签: c++ performance stack

我知道从堆栈中分配内存更快,但是在访问更快的变量时 例如:

void fn1()
{
    int *p=new int[50];
    for(int i=0;i<50;i++)
        p+i=i*i;
}

void fn2()
{
    int p[50];
    for(int i=0;i<50;i++)
        p[i]=i*i;
}

上述哪个功能会更快执行?

我问它是因为我正在用c ++创建一个游戏引擎,并且我经常进行绘制调用,这些调用很小,只涉及矩阵的转换,旋转等,因此哪个分配对我的目的最有用

4 个答案:

答案 0 :(得分:6)

虽然标准没有说明任何内容,但在具有统一内存结构的计算机上应该没有区别。由于CPU中缓存的影响,您可能会看到访问时间的一些差异,因为堆栈中分配的数组p中的数据将更接近(就地址而言)其他局部变量的数据。你的函数(除非优化器选择将这些本地文件放在寄存器中),但整体访问时间应该相同。

对于动态分配的内存,你要采取的最大打击是mallocfree的调用。

答案 1 :(得分:1)

已经有一段时间了,因为我已经深入研究了C ...索引到一个数组应该是一个快速的操作。作为猜测,我会说他们将会是一样的。在第一个函数中,您正在递增指针...在第二个函数中,您将索引到数组中,这与递增指针以到达相应数组元素的内存位置几乎相同。

答案 2 :(得分:0)

您可以通过调用new来分配数组,但之后它们将具有相同的性能特征。

答案 3 :(得分:0)

如果考虑分配,

第二个函数的执行速度比第一个快。当你在堆栈上分配内存时,嵌入指令使得它将移动堆栈指针,并且几乎它将成为大多数架构上的单个指令。