【问题标题】:Which Is Faster Accessing The Stack Or The Heap? [closed]访问堆栈或堆哪个更快? [关闭]
【发布时间】:2014-01-09 06:07:12
【问题描述】:

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

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++ 创建一个游戏引擎,而且我经常进行绘制调用,这些调用非常小,仅涉及矩阵的变换、旋转等,因此哪种分配对我的目的最有用

【问题讨论】:

  • 你是指栈还是堆?
  • 为什么不测试一下?
  • 无法保证我知道任何一种方式,尤其是在NUMA 机器上,但通常new 与仅在堆栈上保留空间相比非常慢.问题是,在用数据填充内存后,您将使用内存做什么?如果要返回数据,堆分配的数据不需要复制,而堆栈数据则需要。
  • 测量时间也许;)?

标签: c++ performance stack


【解决方案1】:

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

动态分配内存最大的打击是mallocfree 的调用。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如果考虑分配,

        第二个函数比第一个函数执行得更快。当你在堆栈上分配内存时,指令会被嵌入,这样它就会移动堆栈指针,而且在大多数架构上它几乎都是一条指令。

        【讨论】:

          猜你喜欢
          • 2013-03-21
          • 2013-05-10
          • 2013-03-04
          • 1970-01-01
          • 2011-06-13
          • 2020-04-09
          • 2015-05-27
          • 2012-11-03
          • 2014-07-26
          相关资源
          最近更新 更多