调用父替换函数的成本

时间:2011-10-27 10:31:17

标签: c++ optimization inheritance overrides

在以下代码中:

class Base
{
   void funcA();
   void funcB();
   .
   .
};

class Derv : public Base
{
   int m_state;
   void funcA(){ m_state = 1; Base::funcA(); }
   void funcB(){ m_state = 4; Base::funcB(); }
   .
   .
};

Derv a;
a.funcA();

Base::funcA()是一个单独的函数调用(Derv::FuncA() -> Base:FuncA()),还是内联代码? 如果它是编译器相关的,编译器(e.x GCC)是否足够智能内联它?

2 个答案:

答案 0 :(得分:3)

这取决于Base::funcA()Base::funcB()的实施情况 如果编译器可以,则编译器将内联它 大多数现代编译器(包括gcc)都足够聪明。

C ++标准允许编译器执行任何优化只要生成的可执行文件表现出相同的可观察行为,就像那样,标准的所有要求都已满足。

这称为 As-If规则

答案 1 :(得分:2)

完全取决于编译器。即使使用inline指令,也无法保证内联。最好的方法是直接查看生成的代码。

此外,您可能会发现优化器不仅仅是智能的。例如:

class Base
{
   void funcA() {};
   void funcB() {}; 
   .
   .
};

class Derv : public Base
{
   int m_state;
   void funcA(){ m_state = 1; Base::funcA(); }
   void funcB(){ m_state = 4; Base::funcB(); }
   .
   .
};

int main()
{
   Derv a;
   a.funcA();
   return 0;
}

将完全跳过代码并返回0。