试图查看编译后的 C++ 的汇编输出
在 https://godbolt.org/ 上,编译器为 x86-64 gcc9.2
案例 1:
链接:https://godbolt.org/z/jFkC4Q
class B
{
public: virtual void fun1() {}
};
class D: public B
{
public: virtual void fun1() {}
};
int main()
{
//Empty Main.
//Not creating any object of B or D.
return 0;
}
以上代码的结果是:
main:
push rbp
mov rbp, rsp
mov eax, 0
pop rbp
ret
案例 2:
链接:https://godbolt.org/z/WyNY9j
class B
{
public: virtual void fun1() {}
};
class D: public B
{
public: virtual void fun1() {}
};
int main()
{
//Non Empty Main.
D d; // creating object of D
return 0;
}
以上代码的结果是:
D::fun1():
push rbp
mov rbp, rsp
mov QWORD PTR [rbp-8], rdi
nop
pop rbp
ret
main:
push rbp
mov rbp, rsp
mov eax, OFFSET FLAT:vtable for D+16
mov QWORD PTR [rbp-8], rax
mov eax, 0
pop rbp
ret
vtable for D:
.quad 0
.quad typeinfo for D
.quad D::fun1()
typeinfo for D:
.quad vtable for __cxxabiv1::__si_class_type_info+16
.quad typeinfo name for D
.quad typeinfo for B
typeinfo name for D:
.string "1D"
typeinfo for B:
.quad vtable for __cxxabiv1::__class_type_info+16
.quad typeinfo name for B
typeinfo name for B:
.string "1B"
在第二种情况下,我们可以看到创建了 vtable。