zoukankan      html  css  js  c++  java
  • vptr, vtable, virtual base class table

    #include <iostream>
    using namespace std;
    
    class X {
    	int x, y, z;
    };
    class Y: public virtual X {
    
    };
    class Z: public virtual X {
    	virtual void f() {
    	}
    };
    class A: public Y, public Z {
    };
    
    int main() {
    	A *p;
    	cout << "pointer:" << sizeof(p) << endl;
    	cout << "int:" << sizeof(int) << endl;
    	cout << "X:" << sizeof(X) << endl;
    	cout << "Y:" << sizeof(Y) << endl;
    	cout << "Z:" << sizeof(Z) << endl;
    	cout << "A:" << sizeof(A) << endl;
    
    }
    

      上述代码在64位的linux上的输出如下:(g++)

    在32位的windows上的输出是:(VS2013)

    linux下的解析如下

    X的输出很好理解3*4=12。没问题。

    Y虚继承了X,则Y将会有一个vptr,其中指针占8个字节。此外因为Y是空类,因此编译器会自动地添加一个字节。再加上边界对齐的3个字节。因此8+3*4+1+3=24。

    Z同Y。

    A多重继承Y,Z。则有两个vptr。此外A是一个空类,因此编译器会自动地添加一个字节。再加上边界对齐的3个字节。因此8+8+3*4+1+3=32。

    windows下的解析如下:

    关键是Y,Z和A

    Y类似于linux的Y。但是VS并没有给空类生成一个字节的。因此3*4+4=16。

    Z,VS编译器中,是将virtual base class table和virtual function table区分开的,因为既有虚基类,又有虚函数,因此需要虚函数表指针和虚基类表指针。因此3*4+4+4=20。

    A多重继承,3*4+4+(4+4)=24。

  • 相关阅读:
    CSS样式表引用方式
    引入样式表(css)的四种方式
    html中有序列表标签ol,li的高级应用
    HTML 基本标签
    SEO中HTML标签权重列表
    HTML 和 XHTML 区别
    HTML相对路径和绝对路径
    Django静态博客开发_3_视图与模版(完成一个简单博客的建立)
    Django静态博客开发_2_模型层
    Django静态博客开发_1_入门
  • 原文地址:https://www.cnblogs.com/lhmily/p/3971236.html
Copyright © 2011-2022 走看看