数据段与堆栈

时间:2016-10-14 08:01:04

标签: c stack data-segment

全局变量在数据段中分配,而本地变量在堆栈中保留。我知道访问存储在堆中的变量比访问局部变量要慢,但我不知道访问本地变量是否比访问本地变量更快。它取决于编译器吗?这些差异是否有意义?

2 个答案:

答案 0 :(得分:4)

在阅读之前请参阅本文(我不是在讨论访问堆栈与堆):

Is accessing data in the heap faster than from the stack?

架构和内存管理政策变化如此之大,以至于难以讨论。我将以英特尔x86为例。

无论我们在何处访问,只需通过一条指令访问数据。

<强>&LT; INST&GT; &LT; SEG&GT; :&lt; ADDR&gt;

INST代表我们正在执行的指令。 SEG代表我们访问的细分市场。 VADDR代表虚拟地址。

在实模式下,SEG将是要分段的基址,ADDR将是分段内部的地址。在实际模式下访问数据的效率在每个段中似乎是相同的。 (无论是堆栈,堆还是全局)

在保护模式下,SEG将成为选择器,ADDR将成为虚拟地址。最棘手的是,MMU(内存管理单元)开始工作,并指责访问数据“未预期”。

当您访问的数据不在内存中时,MMU会生成页面错误中断并请求操作系统切换页面。 MMU用更多的时间用硬盘交换页面来谴责你。

因此,仅考虑是否更快地访问全局数据或本地而不考虑如何访问数据是徒劳的。

从我的角度来看,您更有可能访问堆栈“本地数据”而不是全局数据,因此访问全局数据时页面错误概率可能会更高。

答案 1 :(得分:4)

Stack和head只是实现细节,这意味着它们可能依赖于编译环境。 C标准仅定义标识符的链接和存储持续时间。但是你是对的,堆栈,堆和数据段是常见的实现。

但是当你说访问存储在堆中的变量比访问本地变量更慢时,你错了。 分配和取消分配动态内存确实比使用自动变量更复杂并且花费更多时间,但在其生命周期中,访问(无论是用于阅读还是写入)的成本完全相同 - 至少在共同的基础设施上。有什么不同的是:

  • 是处理器缓存中的数据或2级缓存中的数据(加快访问速度)
  • 是当前交换的关闭页面中需要从磁盘重新加载的数据(减慢访问速度)

但动态,自动或静态数据都可能发生相同的情况......