参数变量存储在内存中的啥位置?
Posted
技术标签:
【中文标题】参数变量存储在内存中的啥位置?【英文标题】:Where are Parameter variables stored in memory?参数变量存储在内存中的什么位置? 【发布时间】:2013-04-24 15:46:43 【问题描述】:我正在用 C 编写一些代码,当遇到一个方法时,我想知道参数变量存储在内存中的什么位置。 我知道以下几点:
全局变量 -> 存储在静态代码部分
静态变量 ->
本地自动变量(内部方法)-> 存储在堆栈中
局部静态变量 -> 存储在堆栈中
局部常量变量 -> 存储在堆栈中
假设我的假设是正确的。
但是参数变量存储在哪里?例如: int *(int x, char *c);
谢谢!
编辑: 我知道当我 malloc 某些东西时,它被放在堆上,但是说我取消引用指针以获取指针位置处的值,是也存储在堆中还是现在在堆栈中?
【问题讨论】:
回答您的编辑:该值仍存储在堆中。当您取消引用指针时,您会触发对存储在指针中的任何地址(无论是堆栈、堆等)的内存读取访问。根据编译器生成的机器代码,读取的值可能会临时放入 CPU 寄存器中,以便进行有效的进一步处理。 【参考方案1】:这取决于许多不同的事情,calling convention 是主要要研究的事情。这个x86
页面介绍了各种调用约定以及参数如何传递给函数,this reference 介绍了各种 C++ 编译器和平台使用的调用约定。一般来说,它要么在通过寄存器的堆栈上。
我对@987654324@ 的回答也很相关,并且有一些更有用的链接。
【讨论】:
【参考方案2】:函数参数(“参数”)根本不需要存储。请记住:C 使用 按值调用。值不需要存储在内存位置,它可以存在于寄存器中,或者它的值可以通过某种方式从程序状态中得出。
例如,诸如 strlen() 或 sin() 、 cos() 、 sqrt() 之类的库函数可以在硬件中实现。 sin(x) 可以通过将一些与x
对应的值存储到特殊功能寄存器中,发出特殊功能指令并将结果取出来实现。 (浮点硬件有时甚至有伪指令以尽可能高的精度表示例如 Pi。永远不会传递 Pi 值,只有指令:“使用 Pi/2”)
即使对于“普通”用户定义的函数,参数也可以通过寄存器传递,多个参数可以组合成一个大寄存器,甚至可以优化出来。
这在内联函数中最明显,这些可以完全消失,因为它们的功能已经与调用者的功能相结合。
当函数获取其参数之一的地址时,情况会有所不同(例如,int func(int arg) int *p = &arg;
将强制 arg 具有地址),但这种情况相对较少。
WRT 标准:C 函数有一个激活记录。 (非标准的人可能会称之为“堆栈框架”)。并且函数的行为就好像参数是其局部变量的一部分,一旦函数返回,它们就会超出范围。 如何他们得到他们的价值完全无关紧要,理论上它甚至可以通过消息传递来完成。
【讨论】:
【参考方案3】:C、ITYM 函数中没有方法。
全局变量和静态变量一样,存储在 .data 或 .bss 部分(以下称为“数据段”)。
本地静态变量也存储在数据段中。
函数的参数值也存储在堆栈中,紧接在返回地址之前。
堆栈中的所有内容(局部变量、参数等)也可以存在于寄存器中。这就是 C 标准没有明确说明将什么存储在哪里的原因。
【讨论】:
以上是关于参数变量存储在内存中的啥位置?的主要内容,如果未能解决你的问题,请参考以下文章