这是正确的,类成员函数比简单函数花费更多时间吗?如果使用继承和虚函数怎么办?
我试图将我的函数收集到一个简单的接口类中(只有成员函数,没有数据成员),看来我浪费时间。 有办法解决吗?
P.S。我正在检查gcc和icc编译器并使用-O3选项。
答案 0 :(得分:9)
非静态成员函数接受一个额外的参数,该参数是调用该函数的对象(指向它的指针或引用)。这是一个开销。如果函数是虚函数,那么在多态调用的情况下也存在一个小的间接,即,将函数索引添加到虚拟表基本偏移量。这两个“开销”都是可以忽略不计的,你不应该担心,除非探查者说这是你的瓶颈。最有可能的不是。
答案 1 :(得分:4)
成员函数,如果它们不是虚拟的,则与自由函数相同。它的调用没有开销。
但是,在virtual
成员函数的情况下,存在开销,因为它涉及间接,即使这样,当通过指针调用虚函数时它也会变慢或引用(称为多态调用)。否则,如果调用不是多态,则没有区别。
答案 2 :(得分:2)
成员函数不会有额外的时间惩罚。虚函数略慢但不是很多。除非你运行一个非常紧凑的循环,否则即使虚函数开销也可以忽略不计。
答案 3 :(得分:2)
对于正常功能来说,它足够“跳”到它们,这非常快。普通成员函数也是如此。另一方面,虚函数,跳转到的地址必须从表中获取,这当然涉及更多的机器代码指令,因此会更慢。但是,差异可以忽略不计,甚至难以衡量。
换句话说,不要担心。如果你有减速,那么最有可能(比如99,999%)别的东西。使用分析器找出位置。