Стоимость вызова родительской переопределенной функции - PullRequest
1 голос
/ 27 октября 2011

В следующем коде:

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()), или код будет встроенным?если он зависит от компилятора, то достаточно ли умны компиляторы (например, GCC), чтобы встроить его?

Ответы [ 2 ]

3 голосов
/ 27 октября 2011

Зависит от реализации Base::funcA() и Base::funcB().
Если компилятор может, то компилятор встроит его.
Большинство современных компиляторов дня (включая gcc) достаточно умны, чтобы сделать это.

Стандарт C ++ позволяет компилятору выполнять любую оптимизацию, если результирующий исполняемый файл демонстрирует такое же наблюдаемое поведение , как если бы все требования стандарта были выполнены.

Это называется правилом как если бы .

2 голосов
/ 27 октября 2011

Это полностью зависит от компилятора. Ничего не гарантируется, даже если используется директива 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.

...