C ++是否用函数调用替换内置运算符?

时间:2018-12-17 21:14:03

标签: c++ operator-overloading

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

例如,a + b(a和b是int类型)是否被a.operator +(b)替换?还是编译器有所不同?

3 个答案:

答案 0 :(得分:7)

没有int::operator+。编译器是选择直接编译a + b到程序集(可能)还是用诸如int __add_ints(int, int)这样的内部函数(不太可能)替换它是实现细节。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

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