Обычно нет необходимости пытаться помочь такому компилятору.Компиляторы очень хороши в оптимизации такого рода вещей.Вам не нужно указывать компилятору Foo::call
на самом деле просто Bar::call
.Компилятор это выяснит.Рассмотрим слегка подправленный пример:
extern void DisplayMessage(char const*);
class Bar {
public:
void call() {
DisplayMessage("Hello there");
}
};
class Foo {
public:
void call() {
b.call();
}
private:
Bar b;
};
int main() {
Foo f;
f.call(); // This calls directly the b.call() function
}
Когда я компилирую это с использованием Clang 7.0 и -O3, я получаю следующее:
main: # @main
push rax
mov edi, offset .L.str
call DisplayMessage(char const*)
xor eax, eax
pop rcx
ret
Обратите внимание, что компилятор полностью удалил объекты иоставил только прямой вызов функции DisplayMessage
.