#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。

vptr, vtable, virtual base class table的更多相关文章

  1. virtual base classes

    virtual base classes用来实现菱形继承解决多个重复subobject的问题 //: C09:VirtualBase.cpp // Shows a shared subobject v ...

  2. cannot convert from pointer to base class 'QObject' to pointer to derived class 'subClass' via virtual base 'baseClass'

    QT 编译不过的另一个问题: 1. 新建一个console工程 QT -= gui CONFIG += c++ console CONFIG -= app_bundle # The following ...

  3. Virtual Memory PAGE TABLE STRUCTURE

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION The basic mechanism f ...

  4. C++对象模型(五):The Semantics of Data Data语义学

    本文是<Inside the C++ Object Model>第三章的读书笔记.主要讨论C++ data member的内存布局.这里的data member 包含了class有虚函数时 ...

  5. c++后台开发面试常见知识点总结(一)c++基础

    指针和引用的区别 extern,const,static,volatile关键字 #define 和const的区别 关于typedef和#define; C++程序中内存使用情况分析(堆和栈的区别) ...

  6. c++ 虚继承与继承的差异 (转)

    转自:CSDN dqjyong 原文链接:http://blog.csdn.net/dqjyong/article/details/8029527 前面一篇文章,说明了在C++ 虚继承对基类构造函数调 ...

  7. 《深度探索c++对象模型》chapter1关于对象对象模型

    在c++中,有2种class data member:static和nostatic,以及3钟class member function:static,nostatic和virtual.已知下面这个c ...

  8. Data 语义学(2)

    四."继承"与 Data Member (1). 只有继承没有多态 先来看个例子 #include <iostream> using namespace std; cl ...

  9. 深入探索C++对象模型-1

    概述 在实际生产中,遇到一个复杂的类,如果能看出这个类的内存模型结构,那么以后的操作基本就没有难度的: 所以说,学会分析一个类的内存模型,是每一个C++程序员必须要会的知识. 下面,就让我们来了解C+ ...

随机推荐

  1. New Concept English three (23)

    31w 45 People become quite illogical when they try to decide what can be eaten and what cannot be ea ...

  2. TeamView

    1.TeamView TeamViewer是一个能在任何防火墙和NAT代理的后台用于远程控制,桌面共享和文件传输的简单且快速的解决方案.为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamV ...

  3. HDU 3378

    http://acm.hdu.edu.cn/showproblem.php?pid=3378 规则去玩三国杀就理解了 纯模拟 注意的点:有已经分出胜负但还在杀的情况出现,所以要每次杀操作前判断是否分出 ...

  4. 人生苦短之我用Python篇(队列、生产者和消费者模型)

    队列: queue.Queue(maxsize=0) #先入先出 queue.LifoQueue(maxsize=0) #last in fisrt out  queue.PriorityQueue( ...

  5. [IC]Lithograph(2)光刻技术的分辨率与分辨率增强技术

    接上一篇介绍IC制造的基本过程,光刻的基本过程.这篇文章继续介绍光刻过程中的一些概念. 该系列文章的目录如下: [IC]Lithograph(0)半导体制造的基本过程 [IC]Lithograph(1 ...

  6. Git 中文教程

    以下内容转载自:http://www.open-open.com/lib/view/open1328928294702.html Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点 在于 ...

  7. Hello Pythoner!

    首先,欢迎你来到pyer的博客,希望你能有所收获! 然后,pyer之前学C#(原博客地址:初行-博客园),后来转的Python,目前从事服务端研发工作. 最后,相逢便是缘,如果看过pyer的博客后有什 ...

  8. (转载)从MVC到前后端分离

    摘要:MVC模式早在上个世纪70年代就诞生了,直到今天它依然存在,可见生命力相当之强.MVC模式最早用于Smalltalk语言中,最后在其它许多开发语言中都得到了很好的应用,例如,Java中的Stru ...

  9. BZOJ1013 JSOI2008 球形空间产生器sphere 【高斯消元】

    BZOJ1013 JSOI2008 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点 ...

  10. 阿里云ECS 环境是CentOS 7.3安装mongodb3

    CentOS安装mongodb https://www.cnblogs.com/zddzz/p/10069912.html CentOS安装mongodb 我的是阿里云ECS 环境是CentOS 7. ...