主流编译器是否将引用传递基本类型转换为复制传递?

2024-04-19

通过引用传递对象是向其传递地址的更简单、更快且更安全的方法。 但对于大多数编译器来说,都是一样的:引用实际上是指针。

现在基本类型怎么样int?将地址传递给int在函数内部使用它会比通过复制传递它慢,因为在使用之前需要取消引用指针。

现代编译器如何处理这个?

int foo(const int & i)
{
   cout << i; // Do whatever read-only with i.
}

我可以相信他们会把这个编译成这个吗?

int foo(const int i)
{
   cout << i;
}

顺便说一句,在某些情况下,通过这两个选项甚至可能更快i and &i,然后使用i用于阅读,以及*i用于写作。

int foo(const int i, int * ptr_i)
{
   cout << i;    // no dereferencement, therefore faster (?)
   // many more read-only operations with i.
   *ptr_i = 123;
}

我可以相信他们会把这个编译成这个吗?
是的,你可以。[这里的“是”意味着不同,请阅读编辑部分,其中澄清了]

int foo(const int & i)

告诉编译器i是对常量整数类型的引用。
编译器可以执行优化,但只允许执行以下优化:假设规则。因此,您可以放心,对于您的程序,上述行为将与(const预选赛将受到尊重):

int foo(const int i)

假设规则:

C++ 标准允许编译器执行任何优化,只要生成的可执行文件表现出相同的可观察行为,就像已满足标准的所有要求一样。

对于斯坦德德斯球迷:
C++03 1.9《程序执行:

需要一致的实现来模拟(仅)抽象机的可观察行为。

脚注说:

该规定有时被称为“假设”规则,因为只要结果就像遵守了要求一样,只要可以从可观察的行为中确定,实施就可以自由地忽略本国际标准的任何要求的程序。例如,如果实际实现可以推断出其值未被使用并且不会产生影响程序可观察行为的副作用,则实际实现不需要评估表达式的一部分。

EDIT:
由于答案有些混乱,让我澄清一下:
优化不能在编译器上强制执行。因此编译器如何解释它取决于编译器。重要的是程序的可观察行为不会改变。

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

主流编译器是否将引用传递基本类型转换为复制传递? 的相关文章

随机推荐

  • 创建批处理文件以更改 Windows 7 中的电源选项

    有没有办法创建批处理文件并将其放在桌面上以更改 Windows 7 中的电源选项 具体来说 我将计算机设置为 30 分钟后休眠 现在我使用 Serve To Me Stream To Me 应用程序 我希望能够快速更改电源设置以允许连续操作
  • android在picasso加载后获取Drawable图像

    我正在使用 Picasso 库从 url 加载图像 我使用的代码如下 Picasso with getContext load url placeholder R drawable placeholder error R drawable
  • 如何将子集合添加到 Firebase Cloud Firestore 中的文档

    该文档没有任何有关如何将子集合添加到文档的示例 我知道如何将文档添加到集合以及如何将数据添加到文档 但是如何将集合 子集合 添加到文档 难道不应该有这样的方法 dbRef document example addCollection sub
  • 创建 UI 设计师

    我想使用 Silverlight WPF 或 WinForms 为自定义系统创建一个 UI 设计器 解决这个问题的最佳方法是什么 我应该注意哪些命名空间 SDK 等 我建议你看看sharpdevelophttp www icsharpcod
  • setTimeout 会使用 Heroku 免费的 dyno 小时吗?

    我有一个机器人 它的命令允许用户输入一条用破折号分隔的消息 然后输入指定的时间 然后将其传递给机器人 机器人在指定的时间过去后用该消息提醒用户 function reminder msg const message msg content
  • 如何使用位码选项制作胖框架?

    环境 XCode 7 0 1 模块 Objective C 捆绑类型 框架 你好 我正在尝试创建一个支持armv7 armv7s arm64 i386和x86 64的框架 我正在使用聚合来制作脂肪库 在聚合脚本中 我正在运行两个 xcode
  • VS Code - 错误:EPERM:不允许操作

    在 Windows 10 中使用 VS code 时 我遇到了很多权限问题 When trying to move a folder 错误 EPERM 不允许操作 重命名 路径 a gt 路径 b When deleting a folde
  • 等待 Firestore 查询完成

    我目前正在尝试在 firestore 中运行多个查询 并希望等待它们全部完成后再执行下一个代码 我已经阅读了几种可能的途径 但还没有找到一个好的 Android 示例 public HashMap
  • 单击项目菜单时如何关闭抽屉菜单?

    这是点击事件 view setOnTouchListener new View OnTouchListener Override public boolean onTouch View v MotionEvent event v setBa
  • 为什么使用分号? [复制]

    这个问题在这里已经有答案了 除了主观视觉感知和同一行有多个语句的情况之外 是否有任何理由在 JavaScript 中的语句末尾使用分号 看起来有大量证据表明分号的使用是高度可选的 并且只有少数特定情况需要使用分号 因为当 JavaScrip
  • FQL Multiquery 编写联接查询

    简单的说 我需要帮助构建 FQL 多查询请求 该请求将执行以下操作 然后从登录用户的好友列表中获取 UID 使用这些 ID 获取过去两周的所有评论和消息 来自流 最后 将这些结果与用户名连接起来 这是我迄今为止的疑问 1 GRAB UID
  • with(nolock) 或 (nolock) - 有区别吗?

    一切都基于 with nolock 完全适合这种情况的假设 已经有很多问题在争论是否使用 with nolock 我环顾四周 无法找到使用之间是否存在实际差异with nolock select customer zipcode from
  • 如何使用 jQuery 验证插件验证正则表达式?

    如何使用 jQuery 验证插件验证正则表达式 在此代码中 我们可以使用一个 jQuery 插件 jQuery Validation 插件来验证表单 但我不知道如何使用此插件来验证正则表达式
  • 排序在非字母(即亚洲)语言中意味着什么?

    我有一些代码可以按对象属性对表列进行排序 我想到 在日语或中文 非字母语言 中 发送到排序函数的字符串将以字母语言的方式进行比较 以日本姓氏列表为例 寿拘 Suzuki 松坂 Matsuzaka 松井 Matsui 山田 Yamada 藤本
  • 窗口中的图标属性导致 Windows XP SP2 中的应用程序崩溃

    假设我有这个
  • 如何将 JFileChooser 限制为自定义文件类型? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我遇到了一些小问题JFileChooser 我想限制只读取某些类型的文件 另一个堆栈答案建议使用File
  • 每次项目运行时,带有主菜单的窗体都会缩小

    每当我构建以下程序时Form1的大小缩小了20 有些情况我需要对表格做一些改变 比如移动someLaggyControl1几个像素 但并非总是如此 这很奇怪 该表格使用了MainMenu https msdn microsoft com e
  • 这个 PHP(函数/构造?)有什么作用,在哪里可以找到更多关于它的文档?

    简单的问题 这是这段代码 r rand 0 1 c r 0 rand 65 90 rand 97 122 inputpass chr c 我明白它的作用end结果 但我想要更好地解释它是如何工作的 这样我就可以自己使用它 抱歉 如果这是一个
  • 获取“TypeError:schema.virtual(...).get 不是函数”

    当我尝试定义架构时出现此错误 Error node modules mongoose lib plugins idGetter js 12 schema virtual id get idGetter TypeError schema vi
  • 主流编译器是否将引用传递基本类型转换为复制传递?

    通过引用传递对象是向其传递地址的更简单 更快且更安全的方法 但对于大多数编译器来说 都是一样的 引用实际上是指针 现在基本类型怎么样int 将地址传递给int在函数内部使用它会比通过复制传递它慢 因为在使用之前需要取消引用指针 现代编译器如