C++ 当从函数返回结构体时,汇编中实际发生了什么?

2023-11-23

我试图弄清楚如果从函数中按值返回结构,而不是返回指向该结构的指针,那么在 C++ 中实际会发生什么。如果函数只能返回适合寄存器的值,那么当按值发送结构时,如何进行通信? (我在某处读到过。)

我尝试在 Godbolt 上测试它,看看它在做什么。但我不了解大会,所以这对我来说有点乐观。

在我看来,没有太多汇编知识,该函数只是更改调用该函数之前存在的一些内存?那么这个概念return从函数中获取某些内容只是一个抽象,该函数只是在已经存在的内存位置中设置一些字节,然后结束跳回到main()?在这种情况下,根本不会复制任何内容,并且返回的是 “自由的”?

Godbolt:返回整数

Godbolt:返回 struct{int int int}


如果函数只能返回适合寄存器的值,那么当按值发送结构时,如何进行通信?

函数可以返回任何合法返回的内容。然而,只能使用寄存器大小或更小的值来实现return陈述按照将值留在单个寄存器中的约定,出于显而易见的原因。一些实现允许使用多个寄存器来表示大数据类型;当然,这意味着调用者必须被编写为期望检查多个寄存器以获得完整的返回值。

机器级别的“发生了什么”并不是由语言标准指定的,而是取决于特定的编译器、其优化能力、体系结构的细节等。直截了当实施于ordinary平台的目的是让调用者在堆栈上保留空间(以便它在清理之后持续存在)并让被调用者在那里写入数据。由于分配是静态的,因此在计算调用者的堆栈帧的大小时通常可以简单地考虑所需的空间。该实现可能会默默地生成一个指针并将其传递给寄存器中的被调用者;或者它可能会安排每个调用者将此保留空间放在其堆栈帧中的同一位置,以便被调用者可以向堆栈指针添加偏移量以确定写入位置;或者它可能会做一些我目前没有足够创造力想到的其他事情。

有很多方法可以处理机器级别的函数之间的信息通信,具体取决于机器和语言(尽管我们在进行这些讨论时通常讨论的是 C 或 C++,因为所有其他流行的选择要么在虚拟机上运行,​​被解释或发生其他一些奇特的事情)。您想要研究的通用术语是应用程序二进制接口,或 ABI。

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

C++ 当从函数返回结构体时,汇编中实际发生了什么? 的相关文章

随机推荐

  • 正确地将 DateTime 从 C# 插入到 mongodb

    我尝试在 MongoDB 中插入当地时间 var time DateTime Now 03 05 2014 18 30 30 var query new QueryDocument time nowTime collection3 Inse
  • 为什么要使用 urlencode?

    我正在编写一个 Web 应用程序并学习如何对 html 链接进行 urlencode 这里的所有 urlencode 问题 参见下面的标签 都是 如何 问题 我的问题不是 如何 但为什么 即使维基百科的文章也只讨论了它的机制 http en
  • 移动 NumPy 数组中的所有索引

    我有一个像这样的 numpy 数组 x np array 0 1 2 3 4 想要创建一个数组 其中索引 0 中的值位于索引 1 中 索引 1 中的值位于索引 2 中 依此类推 我想要的输出是 y np array 0 0 1 2 3 我猜
  • 在命令行中制作java包

    虽然它可能是推荐使用的 IDE 来编码高级 java 项目 但我个人更喜欢几乎完全运行命令行 使用 gedit 作为文本编辑器 所以请不要只是告诉我 就用 eclipse 吧 或其他什么 P 我的问题是在java中通过命令创建包的方法是什么
  • 使用 group by 进行 SQL 连接的 HQL 版本

    我有两张表 Band 和 Votes Band 有一个名称和一个 id Votes 有一个 Total votes 列和一个名为 band id 的外键 该外键指向 band id 我有很多选票 在不同日期保存 我想要做的是找到每个频段的
  • 如何使用 readline 支持重新安装 ruby​​?

    我已经按照 RVM 的说明安装了 Rubyhttps github com wayneeseguin rvm installation 作为信息 我有所有档案 readline 5 2 tar gz readline 6 2 tar gz
  • 在 java eclipse 控制台中更改颜色

    有没有办法改变eclipse控制台中的文本颜色 我不是在谈论当我进入选项并将颜色从黑色更改为红色时 我的意思是 就像当我启动程序并执行代码时 它会在某个时刻改变颜色 例如 code if a 2 change text color to r
  • SimpleCov 报告使用 Spork 运行 RSpec 测试后未在 Rails 3 应用程序中生成

    我刚刚安装了简单冠状病毒gem 在我的 Rails 3 2 6 应用程序上生成代码覆盖率报告 它与 RSpec 配合得很好 但与 Spork 配合不好 我可以通过运行获得所需的正确报告rspec no drb spec 但我也想让它们与 S
  • 没有删除语句的 MySQL 复制

    我一直在寻找一种方法来防止MySQL删除语句被从站处理 我正在从事数据仓库项目 我想在将数据复制到从站后从生产服务器中删除数据 完成这件事的最佳方法是什么 谢谢 做这件事有很多种方法 Run SET SQL LOG BIN 0 在执行删除之
  • 如何交错流(带背压)

    假设我有两个可能无限的流 s1 a b c d e s2 1 2 3 4 5 6 7 我想要merge流 然后使用缓慢的异步操作映射合并流 例如 在 Bacon 中 fromPromise and flatMapConcat 我可以将它们与
  • 服务器端多次TIME_WAIT的代价是多少?

    假设有一个客户端与服务器建立了大量短期连接 如果客户端关闭连接 会出现很多端口TIME WAIT在客户端声明 由于客户端耗尽了本地端口 因此无法快速尝试新的连接 如果服务器关闭连接 我会看到很多TIME WAIT在服务器端 然而 这有什么坏
  • SQL 在 WHERE 子句中合并

    我正在尝试在我拥有的存储过程中实现可选参数 但遇到了问题 这是一个简化的查询来说明该问题 SET ANSI NULLS OFF DECLARE MiddleName VARCHAR 20 SET MiddleName NULL SELECT
  • NumberFormat 解析不够严格

    我有一个JFormattedTextField with a NumberFormat与 Locale US 因此小数点分隔符是点 分组分隔符是逗号 现在 我在此文本字段中键入字符串 1 23 并将焦点移至另一个组件 我希望该字符串会消失
  • Hibernate 升级:StatisticsService()

    我正在将 hibernate 从 3 6 升级到 4 3 5 更换后 jar文件和一些已弃用的包 类以及基本数据类型我仍然遇到一些错误StatisticsService 在org hibernate jmx包裹 错误如下 1 error p
  • Ruby on Rails:在布局中的特定位置生成特定视图

    如果我有一个标记 然后我的所有视图都会呈现在布局中的同一位置 我可以有不同的吗不同视图的标签 那我该怎么办呢 谢谢 调查ActionView Helpers CaptureHelper 您可以在您的视图中执行以下操作 这将在 content
  • 复制 QTableView 的一部分

    因此 我有一个问题与我在这里看到的另一个问题非常密切相关 但当我尝试在那里提出我的问题时 我没有得到答复 我希望通过提出这个新问题 有人可以帮助我 基本上我只想复制我创建的表格的一部分 以便我可以将其粘贴到 Excel 文件中 这是我所拥有
  • Python 中的 SSLSocket 密码/密码

    我最近一直在考虑为我的一个应用程序制作 iOS 推送通知服务 它有一个 Python 2 7 后端 所以我想用 Python 而不是 PHP 或其他任何东西 来完成它 我有发送通知并且设备接收通知的代码 但是每次运行该代码时 它都会要求我手
  • 如何将 Javascript 日期时间转换为 C# 日期时间?

    我一直在读到 如果你想从 JavaScript 日期转换为 C 日期 你应该使用getTime 然后将该结果添加到 C DateTime 假设我有这样的 JavaScript 时间 Date Tue Jul 12 2011 16 00 00
  • 如何为iPhone创建一个黑色渐变的UIButton?

    我想在 iOS 中创建一个具有普通黑色渐变主题的 UIButton 我查看了文档 似乎不知道如何执行此操作 当我创建按钮时 我得到一个没有颜色的圆角矩形按钮 这是我的代码 UIButton leagueTeamButton UIButton
  • C++ 当从函数返回结构体时,汇编中实际发生了什么?

    我试图弄清楚如果从函数中按值返回结构 而不是返回指向该结构的指针 那么在 C 中实际会发生什么 如果函数只能返回适合寄存器的值 那么当按值发送结构时 如何进行通信 我在某处读到过 我尝试在 Godbolt 上测试它 看看它在做什么 但我不了