【发布时间】:2018-12-17 21:14:03
【问题描述】:
我最近在阅读有关 C++ 中的运算符重载的文章。所以,我想知道内置运算符是否被幕后的函数调用所取代。
比如a+b(a和b都是int类型)是不是换成了a.operator+(b)?还是编译器做了一些不同的事情?
【问题讨论】:
-
回到 g++ 3.96,用户定义类型的分配通常由 memcpy() 完成。我想编译器一定已经检查过 udt 是 POD。
我最近在阅读有关 C++ 中的运算符重载的文章。所以,我想知道内置运算符是否被幕后的函数调用所取代。
比如a+b(a和b都是int类型)是不是换成了a.operator+(b)?还是编译器做了一些不同的事情?
【问题讨论】:
没有int::operator+。编译器是选择将a + b 直接编译为汇编(可能)还是将其替换为int __add_ints(int, int) 之类的内部函数(不太可能)是一个实现细节。
【讨论】:
编译器的内部结构很复杂。在概念层面上,答案是肯定的。每当编译器看到 a + b 时,它必须检查名称为 operator+ 的已知函数并将其替换为对正确函数的调用。
在实践中,它们有两个重要的细微差别:
【讨论】:
也许吧。许多算术运算将 dir calypso 映射到 CPU 指令中,编译器只会在适当的位置生成适当的代码。如果这不可能,编译器将生成对适当函数的调用,并且运行时库将具有该函数的定义。在过去,浮点数学通常是通过函数调用来完成的。如今,用于桌面系统的 CPU 具有浮点硬件,并且浮点数学是作为直接 CPU 指令生成的。但是嵌入式系统通常没有硬件,所以编译器会生成函数调用。
在早期,甚至整数数学有时也是通过函数调用完成的。由于他的缘故,IBM 1620 有时被称为 CADET:无法添加,甚至无法尝试。
【讨论】: