运算符函数是否也会导致函数开销
Does operator function also cause function overhead
根据我的理解,当我们调用像 foo()
这样的非内联函数时,程序控制将转移到被调用的函数地址,然后将调用者的位置和 return 银行存储到另一个语句的调用者在上一个函数 class 之后。但是,当我使用运算符定义实现 class 时,会发生相同的过程还是会发生有利于运算符功能的不同情况?
运算符重载只是一个具有特殊名称的函数。
编译器将运算符的使用转换为函数调用。
即 a + b
变为 a.operator+(b)
或 operator+(a, b)
,具体取决于重载的定义方式。
(你也可以自己写出来,它的行为完全一样,但没有抓住要点。)
请注意,在这个千年里,我还没有看到任何人担心函数调用开销。在相当现代的机器上它只需要纳秒,除非你制作非常昂贵的参数副本——但你摆脱了复制,而不是函数。
您很可能永远不会遇到这样的情况,即摆脱函数调用是您最优先的速度优化。
Virtual 函数调用在时间非常敏感的情况下可能很重要,例如在紧密循环中,但这种情况很少见。
(并且开销不是函数调用本身,而是由后期绑定引起的。)
根据我的理解,当我们调用像 foo()
这样的非内联函数时,程序控制将转移到被调用的函数地址,然后将调用者的位置和 return 银行存储到另一个语句的调用者在上一个函数 class 之后。但是,当我使用运算符定义实现 class 时,会发生相同的过程还是会发生有利于运算符功能的不同情况?
运算符重载只是一个具有特殊名称的函数。
编译器将运算符的使用转换为函数调用。
即 a + b
变为 a.operator+(b)
或 operator+(a, b)
,具体取决于重载的定义方式。
(你也可以自己写出来,它的行为完全一样,但没有抓住要点。)
请注意,在这个千年里,我还没有看到任何人担心函数调用开销。在相当现代的机器上它只需要纳秒,除非你制作非常昂贵的参数副本——但你摆脱了复制,而不是函数。
您很可能永远不会遇到这样的情况,即摆脱函数调用是您最优先的速度优化。
Virtual 函数调用在时间非常敏感的情况下可能很重要,例如在紧密循环中,但这种情况很少见。
(并且开销不是函数调用本身,而是由后期绑定引起的。)