局部变量和其他变量类型的地址存储在哪里

Where are the addresses of local and other variable types stored?

本文关键字:地址 存储 在哪里 类型 其他 变量 局部变量      更新时间:2023-10-16

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

1-这些局部变量的地址存储在哪里?程序如何知道它应该在堆栈上查找每个局部变量的位置?这些引用(每个变量的地址)是否保存在数据细分受众群中?其他变量类型(全局、指针等)的地址怎么样

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

  1. 编译器将跟踪每个参数和局部变量相对于堆栈顶部的位置。如果可能的话,编译器将使用"重要"变量(例如循环计数器)的寄存器 - 它将使用每个变量使用多少次的统计信息来查看哪些变量是"热的"(使用了很多),哪些是"冷的"(使用不多)。

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

    编译器将知道每个东西在哪里 - 这是编译器所做的 - 就像它知道哪个变量存储在数据部分的位置一样。具体如何做到这一点是一本小书的主题。现在,只需相信编译器会这样做。

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

    虽然堆栈有时算作"数据段",但在现代机器上,它通常是它自己的内存部分 - 如果您有多个线程,每个线程都有自己的堆栈。

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


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

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

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

    它们在整个程序执行过程中都是恒定的

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

    它们在整个程序执行过程中都是恒定的

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

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


在处理局部变量时,程序直接(不使用弹出/推送)读/写堆栈段中的不同地址是否正确?

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

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

另请参阅类似的 CS SE 问题。