我最近在阅读有关C ++中运算符重载的信息。因此,我想知道内置运算符是否被幕后的函数调用所取代。
例如,a + b(a和b是int类型)是否被a.operator +(b)替换?还是编译器有所不同?
答案 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:无法添加,甚至无法尝试。