我已经提到了这个问题(我改变了它的标题)。我知道与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
继承没有任何额外的成本,当某些优化是 ON 时?我是否需要执行任何更复杂的测试代码来评估它?请注意,如果不进行优化,这些程序集之间存在差异。