局部变量和其他变量类型的地址存储在哪里
Where are the addresses of local and other variable types stored?
有人问我这个问题,我不太确定答案。我知道局部变量的值(内容)在堆栈上,而分配的值(内容)在堆上(在 C/C++ 语言中)。但:
1-这些局部变量的地址存储在哪里?程序如何知道它应该在堆栈上查找每个局部变量的位置?这些引用(每个变量的地址)是否保存在数据细分受众群中?其他变量类型(全局、指针等)的地址怎么样
2-在处理局部变量时,程序直接(不使用pop/push)读/写堆栈段中的不同地址是否正确?
-
编译器将跟踪每个参数和局部变量相对于堆栈顶部的位置。如果可能的话,编译器将使用"重要"变量(例如循环计数器)的寄存器 - 它将使用每个变量使用多少次的统计信息来查看哪些变量是"热的"(使用了很多),哪些是"冷的"(使用不多)。
请注意,"局部变量地址"并不总是适用。寄存器没有(直接)地址[除了在TI TMS9900处理器和其他一些处理器中,寄存器和存储器的线略微模糊]。
编译器将知道每个东西在哪里 - 这是编译器所做的 - 就像它知道哪个变量存储在数据部分的位置一样。具体如何做到这一点是一本小书的主题。现在,只需相信编译器会这样做。
-
是的,今天几乎所有处理器都允许从堆栈 + 偏移量读取和写入(其中偏移量通常为负数,因此堆栈通常向零增长)。
虽然堆栈有时算作"数据段",但在现代机器上,它通常是它自己的内存部分 - 如果您有多个线程,每个线程都有自己的堆栈。
首先,对于协议,我们只需要注意,这两个问题的答案都受编译器实现的影响,而不是由语言标准(也不是 C 也不是C++)决定的。
这些局部变量的地址存储在哪里?
符号(函数和变量的名称)在编译过程中被转换为地址,即它们不存储在执行程序的内存中的任何位置:
-
函数的地址位于可执行映像的代码段中
它们在整个程序执行过程中都是恒定的
-
静态和/或全局变量的地址位于可执行映像的数据段中
它们在整个程序执行过程中都是恒定的
-
非静态局部变量的地址位于可执行映像的堆栈中
每次调用声明这些变量的函数时,它们可能不同
在处理局部变量时,程序直接(不使用弹出/推送)读/写堆栈段中的不同地址是否正确?
取决于您的平台(底层硬件架构 + 指定的编译器)。
Re #2:"堆栈"是堆栈帧,而不是单独的局部变量。 虽然有时会推送和弹出单个值(例如,返回地址),但通常通过简单地调整堆栈指针来一次创建所有局部变量。 在堆栈上"创建"一个区域而不在那里存储任何特定值(这就是为什么未初始化的变量可能具有任何值),然后使用堆栈指针的偏移量来查找各个变量。
另请参阅类似的 CS SE 问题。
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- 为什么存储在数组中的地址值与其自己的地址相同,它应该指向某个不同的地址(&arr[0])?
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 存储 std::list 元素的地址;内存
- 为什么这段代码给出错误......'a'是指针到字符指针,应该存储's'的地址,因为s是指向数组的第一个元素的指针
- 如何反转存储在内存地址的位?
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 为什么存储对象地址在缓冲区中会导致内存泄漏并删除它们
- 相同的地址存储在链表的头部
- 可以读/写EEPROM地址,但是只能读/写第一个存储页面
- 整数必须存储在连续的内存地址中吗?
- 如何将内存地址存储在整数中?
- 可以将内存地址存储为整数类型
- 将地址存储到矢量中的堆栈分配对象
- 局部变量和其他变量类型的地址存储在哪里
- 将缓冲区的地址存储为无符号整数;
- 将地址存储为字符串
- 将指针的内存地址存储为整数
- 将字符的地址存储到整数指针