Я думаю, что более вероятно, что компилятор проведет более масштабную оптимизацию.Вы должны изучить фактический машинный код, но, например, следующая тривиальная попытка:
#include <iostream>
class B {
public:
void F( int x, int y ) {
std::cout << x << ", " << y << std::endl;
}
};
class A {
B b;
public:
void F( int x, int y ) {
b.F( x, y );
}
};
int main() {
A a;
a.F( 32, 64 );
}
заставляет компилятор (cl.exe из VS 2010, пустой проект, ванильная конфигурация Release) выполнитьпроизводить сборку, которая полностью встраивается в дерево вызовов;в основном вы получаете «push 40h, push 20h, вызов std :: operator <<.» </p>
Злоупотребление __declspec(noinline)
заставляет cl.exe понять, что A :: F просто пересылает B :: F и определениеA :: F - это не что иное, как «вызов A :: F» без манипуляций со стеком или регистром (так что в этом случае он выполнил необходимую вам оптимизацию).Но обратите внимание, что мой пример чрезвычайно надуманный и поэтому ничего не говорит о способности компилятора делать это хорошо в целом, только то, что это можно сделать.
В вашем реальном сценарии вам придется изучитьразборка самостоятельно.В частности, необходимо учитывать параметр 'this' (обычно cl.exe передает его через регистр ECX) - если вы выполняете какие-либо манипуляции с переменными-членами класса, которые могут повлиять на результаты.