存储了本地和其他变量类型的地址在哪里?

时间:2016-02-22 07:29:49

标签: c++ c variables memory-address

我被问到这个问题,我对答案不太确定。我知道局部变量的值(内容)在堆栈上,而在堆上分配的那些(在C / C ++语言中)。但是:

1-这些局部变量的地址存储在哪里?程序如何知道堆栈中应该查找每个局部变量的位置?这些参考(每个变量的地址)是否保存在数据段中?其他变量类型的地址如何(全局,指针,......)

2-我是否正确当程序处理局部变量时,程序直接(不使用pop / push)读/写堆栈段中的不同地址?

3 个答案:

答案 0 :(得分:3)

  1. 编译器将跟踪相对于堆栈顶部的位置,每个参数和局部变量的位置。如果可能的话,编译器将使用寄存器来处理“重要”变量(例如循环计数器) - 它将使用每个变量用于查看哪些变量“热”(大量使用)以及哪些变量的统计信息。感冒“(用得不多)。

    请注意,“局部变量的地址”并不总是适用。寄存器没有(直接)地址[除了TI TMS9900处理器和其他一些处理器,其中寄存器和存储器的线条略微模糊]。

    编译器将知道每个东西的位置 - 这是编译器的作用 - 就像它知道WHICH变量已存储在数据部分的位置一样。究竟如何做到这一点是一本小书的主题。现在,请相信编译器会这样做。

  2. 是的,今天几乎所有的处理器都允许从堆栈+偏移量读取和写入(其中偏移量通常为负值,因此堆栈的下游通常会增加,因为堆栈通常会向零增长)。

    虽然堆栈有时被视为“数据段”,但它通常是现代机器上自己的内存部分 - 如果你有多个线程,每个线程都有自己的堆栈。

答案 1 :(得分:1)

首先,对于协议,让我们注意两个问题的答案都要经过编译器实现,而不是由语言标准决定(也不是C既不是C ++)。

  

这些局部变量的地址存储在哪里?

符号(函数和变量的名称)在编译期间被转换为地址 ,即它们不会存储在已执行程序的内存中的任何位置:

  • 函数的地址位于可执行映像的代码段中

    它们在整个程序执行期间保持不变

  • 静态和/或全局变量的地址位于可执行映像的数据段中

    它们在整个程序执行期间保持不变

  • 非静态局部变量的地址位于可执行映像的堆栈中

    每次调用声明这些变量的函数时,它们可能不同

  

在处理局部变量时,我是否正确直接(不使用pop / push)读取/写入堆栈段中的不同地址?

取决于您的平台(底层硬件架构+指定编译器)。

答案 2 :(得分:0)

Re#2:"堆栈"是stack frames,而不是单独的局部变量。虽然有时会推送和弹出单个值(例如,返回地址),但通常只需调整堆栈指针即可一次创建局部变量。那"创造"堆栈中的一个区域,不存储任何特定值(这就是为什么未初始化的变量可能具有任何值),然后使用堆栈指针的偏移量来查找各个变量。

另见a similar CS SE question