函数的局部变量是如何从栈中访问的?

2024-06-23

From http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/ http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/

以下是函数执行时发生的步骤序列 称为:

  1. 函数调用之外的指令地址被压入堆栈。这就是 CPU 在执行完任务后记住要去哪里的方式。 函数返回。
  2. 堆栈上为函数的返回类型腾出了空间。目前这只是一个占位符。
  3. CPU 跳转到函数的代码。
  4. 当前堆栈顶部保存在称为堆栈帧的特殊指针中。
  5. 在此之后添加到堆栈中的所有内容都被视为该函数的“本地”。
  6. 所有函数参数都放置在堆栈上。
  7. 函数内部的指令开始执行。
  8. 局部变量在定义时被压入堆栈。

我不确定第 6 点是如何运作的。如果所有函数参数都放在堆栈上,那么如何访问它们?

例如,如果有三个参数a, b and c并从顶部像这样放置在堆栈上

| a |
| b |
| c |
|   |
 ...
|___|

现在当函数想要访问时会发生什么c? Are a and b蹦出来?


堆栈是一个隐喻堆栈。记住它仍然是一个RAM,因此如果您知道要查找的内容,则可以访问每个地址而无需弹出其余地址。

自从自动变量的大小在编译时已知- 编译器标记offset对于每个变量,偏移量是从堆栈上的自动变量部分开始的位置确定的[或堆栈的头部,两者都是有效的,具体实现可能取决于体系结构],并且它仅通过以下方式访问它们:start + offset对于每个变量的偏移量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

函数的局部变量是如何从栈中访问的? 的相关文章

随机推荐

  • Nginx - “强制”200 缓存响应而不是 304

    是否有可能以某种方式强制执行 200 缓存 响应 而不是静态文件未修改的 304 响应 如果是这样 您可能会节省大量服务器请求 并显着加快回访者的加载时间 我发现单独的 Expires 并不能正确设置行为 下面是肯定的火 Set cache
  • 从 pdf 转换时的默认 imagemagick 密度

    我们有以下代码 convert foo pdf foo tiff 这多年来一直工作良好 并且生成的 tiff 具有合理的打印质量 我们刚刚升级了 imagemagick 现在 tiff 的分辨率较低 我假设最近的 IM 升级发生了一些变化
  • 使用 Quartz.net 配置 ADOJobStore

    如何使用 Quartz net 设置工作库 他们在网站上提供的教程对我没有帮助 在此页面中虽然有步骤http quartznet sourceforge net tutorial lesson 9 html http quartznet s
  • 私有 EC2 和 HTTP 流量中的 AWS 应用程序

    我有一个应用程序在私有子网的 EC2 实例中运行 以增加额外的安全性 直接从与公共子网关联的面向互联网的 NLB 接收流量 我还在公共子网中配置了一个 NAT 网关 以便私有 EC2 实例可以从 Internet 下载所需的任何内容 我刚刚
  • jQuery onclick addclass/removeclass 并添加淡入淡出

    在过去的三天里 我一直在寻找解决我的问题的方法 我见过很多人和我有同样问题的人 但没有一种解决方案可以解决我的问题 所以我又回到了起点 我请求你们友好的人们的帮助 我现在正在运行以下脚本 该脚本非常适合我 show commentsandn
  • 序列化和反序列化的 xstream 错误

    我在 Java 中使用 xStream 序列化 java 库中的 java 对象 并在客户端反序列化它 我有几个问题 如果我这样做 XStream xstream new XStream xstream setMode XStream ID
  • 动态添加 id 到每个表格单元格

    我正在尝试创建一个动态 js 表 我想动态地为每个单元格提供 id 我想使用这些 id 在不同的 js 事件处理程序中使用 怎样才能做到呢 我尝试过不同的方法 但没有一个有效
  • 如何从 SYSOUT 中删除 DFSORT 消息

    DFSORT 有多个消息 由具有多个排序操作的 COBOL 程序内部使用 我想删除那些 DFSORT 消息并仅保留 COBOL 程序中的消息 你有三个选择 使用 OUTDD ddname Enterprise COBOL 编译器选项更改用于
  • 使用 Retrofit 获取 api

    我有一个网络服务链接 我想用不同的 customerId 来访问它 其形式为 http apidev myserver com au 8980 TestService rest TestService jobs bycustid custo
  • 使图像跟随鼠标指针

    我需要一个火箭来跟随鼠标指针在我的网站上的移动 这意味着它应该旋转以面向运动方向 并且如果可能的话 根据它必须经过的距离加速 这可能吗 也许是jquery 通过使用 jquery 将 mousemove 注册到文档 将图像 css left
  • 为什么需要在 JavaScript 中冻结对象?

    我不清楚何时有人需要使用Object freeze在 JavaScript 中 MDN 和 MSDN 没有提供有用的现实生活示例 我知道尝试在运行时更改这样的对象意味着崩溃 问题是 我什么时候会欣赏这次崩溃 对我来说 不变性是一个设计时间约
  • 如何将文字转换为十六进制值

    从文本文件中读取 2 个字符的值的十六进制表示形式 例如 0C 我需要将相应的十六进制值 X 0C 存储在程序变量中 如以下代码所示 我知道 COBOL 允许执行诸如 MOVE X 0C TO somevariable 之类的操作 但在我的
  • 如果参数不存在,Spring 4.1.5 MVC @RequestParam(required = false, value = "somevalue") 将失败

    我有一个 spring mvc 控制器 它正在为具有多个请求参数的 Web 服务请求提供服务 所有参数均已标注required false 如果请求中的参数不可用 RequestMapping value service deployNew
  • Vue.js 拦截器

    我怎样才能使用interceptor in vue js 因此 在每个请求 响应之前 它应该首先进入拦截器 我已经搜索了很多 但找不到关于此的好的文档 我想像这样使用 JWTAuth function define use strict d
  • 瓦丁组合框

    我想创建 Vaadin 下拉菜单 其中有 2 个分隔符 我找不到实现该方法的方法 任何人都可以帮助我解决这个问题吗 这是我想要显示下拉列表的方式 Option 1 Option 2 select 1 select 2 group 1 我怎样
  • PromQL 查询查找上周使用的 CPU 和内存

    我正在尝试编写一个 Prometheus 查询 它可以告诉我每个命名空间在一段时间内 比如一周 使用了多少 CPU 以及另一个用于内存和网络的百分比 我尝试使用的指标是container spec cpu shares and contai
  • 升级到iOS9后登录流程失败

    将我的应用程序升级到 iOS9 后 我的应用程序中出现错误 内容如下 objc 344 无法形成对 LoginVC 类的实例 0x15919e00 的弱引用 该对象可能被过度释放 或者正在释放过程中 下面是我收到此错误的函数 void di
  • JSON-C 中的内存泄漏

    我搜索了两天 但找不到我的内存泄漏 我尝试了很多想法 但现在我可以确认泄漏位于我使用 json c lib 的 cpp 文件中 这是一个例子 define mark one 6 define mark two 18 define mark
  • Laravel 5 和奇怪的 bug:后面的大括号

    每当我在 Laravel 网站上回顾历史时 我看到的响应是这样的 当我前进到之前的位置时 它也显示了那些括号 如果我在 Chrome 中使用 禁用缓存 选项启动开发人员工具 则不会出现此问题 这Content Type返回的内容确实是app
  • 函数的局部变量是如何从栈中访问的?

    From http www learncpp com cpp tutorial 79 the stack and the heap http www learncpp com cpp tutorial 79 the stack and th