【问题标题】:Does C++ replace built-in operators with function calls?C++ 是否用函数调用替换内置运算符?
【发布时间】:2018-12-17 21:14:03
【问题描述】:

我最近在阅读有关 C++ 中的运算符重载的文章。所以,我想知道内置运算符是否被幕后的函数调用所取代。

比如a+b(a和b都是int类型)是不是换成了a.operator+(b)?还是编译器做了一些不同的事情?

【问题讨论】:

  • 回到 g++ 3.96,用户定义类型的分配通常由 memcpy() 完成。我想编译器一定已经检查过 udt 是 POD。

标签: c++ operator-overloading


【解决方案1】:

没有int::operator+。编译器是选择将a + b 直接编译为汇编(可能)还是将其替换为int __add_ints(int, int) 之类的内部函数(不太可能)是一个实现细节。

【讨论】:

  • 我理解,但为什么说运算符返回值或引用。例如:赋值运算符返回对左侧操作数的引用。我的意思是说为什么使用'return'这个词,它主要用于函数调用。
  • @RomokDas 抱歉,我不是词源专家。
【解决方案2】:

编译器的内部结构很复杂。在概念层面上,答案是肯定的。每当编译器看到 a + b 时,它必须检查名称为 operator+ 的已知函数并将其替换为对正确函数的调用。

在实践中,它们有两个重要的细微差别:

  • 编译器知道基本类型(您无法覆盖),它不需要插入函数调用它可以立即插入正确的“指令”
  • 内联是一个重要的优化,它会在感兴趣的时候移除函数调用

【讨论】:

    【解决方案3】:

    也许吧。许多算术运算将 dir calypso 映射到 CPU 指令中,编译器只会在适当的位置生成适当的代码。如果这不可能,编译器将生成对适当函数的调用,并且运行时库将具有该函数的定义。在过去,浮点数学通常是通过函数调用来完成的。如今,用于桌面系统的 CPU 具有浮点硬件,并且浮点数学是作为直接 CPU 指令生成的。但是嵌入式系统通常没有硬件,所以编译器会生成函数调用。

    在早期,甚至整数数学有时也是通过函数调用完成的。由于他的缘故,IBM 1620 有时被称为 CADET:无法添加,甚至无法尝试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-29
      • 1970-01-01
      • 2019-03-06
      • 2018-09-25
      • 2011-11-02
      • 1970-01-01
      • 2015-05-08
      • 1970-01-01
      相关资源
      最近更新 更多