Я сослался на этот вопрос (я изменил его название). Мне известно, что генерация кода, связанная с virtual
ness, зависит от конкретной реализации. Однако предыдущий вопрос предполагает, что при вызове не виртуального базового метода возникает дополнительная стоимость, связанная с наследованием virtual
.
Я написал следующие тестовые коды и проверил их сборку в g ++ (с -O4
):
Общая часть
struct Base {
int t_size;
Base (int i) : t_size(i) {}
virtual ~Base () {}
int size () const { return t_size; };
};
struct D1 : virtual Base {
int a[10];
D1 () : Base(0) {}
~D1 () {}
};
struct D2 : virtual Base {
int a[20];
D2() : Base(0) {}
~D2 () {}
};
...
void foo (Base *p)
{
if(p->size())
return;
p = 0;
}
int main ()
{
Derived d;
foo(&d);
}
Теперь часть различий здесь:
Код 1 (нормальное наследование)
struct Derived : Base {
Derived () : Base(0) {}
~Derived () {}
int a[100];
};
Код 2 (виртуальное наследование)
struct Derived : virtual Base {
Derived () : Base(0) {}
~Derived () {}
int a[100];
};
Код 3 (множественное виртуальное наследование)
struct Derived : D1, D2 {
Derived () : Base(0) {}
~Derived () {}
int a[100];
};
Общий код здесь .
Когда я проверял его сборку, между всеми 3 версиями нет никакой разницы . И следующий код сборки:
.file "virtualInheritFunctionCall.cpp"
.text
.p2align 4,,15
.globl _Z3fooP4Base
.type _Z3fooP4Base, @function
_Z3fooP4Base:
.LFB1:
.cfi_startproc
rep
ret
.cfi_endproc
.LFE1:
.size _Z3fooP4Base, .-_Z3fooP4Base
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB2:
.cfi_startproc
xorl %eax, %eax
ret
.cfi_endproc
.LFE2:
.size main, .-main
.ident "GCC: (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1"
.section .note.GNU-stack,"",@progbits
Означает ли это, что наследование virtual
не требует дополнительных затрат, когда включена определенная оптимизация? Нужно ли выполнять какой-либо более сложный тестовый код, чтобы оценить это? Обратите внимание, что без оптимизации существует разница между этими сборками.