私はこの質問を参照しました(タイトルを変更しました)。virtual
nessに関連するコード生成は実装固有であることを認識しています。virtual
ただし、以前の質問は、非仮想ベースメソッドを呼び出す場合、継承に関連する追加コストがあることを示唆しています。
私は次のテストコードを書き、そのアセンブリをg ++(with -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
特定の最適化がオンになっている場合、継承に追加のコストがかからないということですか?これを評価するために、もっと複雑なテストコードを実行する必要がありますか?最適化を行わないと、これらのアセンブリ間に違いが生じることに注意してください。