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。
vptr, vtable, virtual base class table的更多相关文章
- virtual base classes
virtual base classes用来实现菱形继承解决多个重复subobject的问题 //: C09:VirtualBase.cpp // Shows a shared subobject v ...
- 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 ...
- Virtual Memory PAGE TABLE STRUCTURE
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION The basic mechanism f ...
- C++对象模型(五):The Semantics of Data Data语义学
本文是<Inside the C++ Object Model>第三章的读书笔记.主要讨论C++ data member的内存布局.这里的data member 包含了class有虚函数时 ...
- c++后台开发面试常见知识点总结(一)c++基础
指针和引用的区别 extern,const,static,volatile关键字 #define 和const的区别 关于typedef和#define; C++程序中内存使用情况分析(堆和栈的区别) ...
- c++ 虚继承与继承的差异 (转)
转自:CSDN dqjyong 原文链接:http://blog.csdn.net/dqjyong/article/details/8029527 前面一篇文章,说明了在C++ 虚继承对基类构造函数调 ...
- 《深度探索c++对象模型》chapter1关于对象对象模型
在c++中,有2种class data member:static和nostatic,以及3钟class member function:static,nostatic和virtual.已知下面这个c ...
- Data 语义学(2)
四."继承"与 Data Member (1). 只有继承没有多态 先来看个例子 #include <iostream> using namespace std; cl ...
- 深入探索C++对象模型-1
概述 在实际生产中,遇到一个复杂的类,如果能看出这个类的内存模型结构,那么以后的操作基本就没有难度的: 所以说,学会分析一个类的内存模型,是每一个C++程序员必须要会的知识. 下面,就让我们来了解C+ ...
随机推荐
- 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 ...
- TeamView
1.TeamView TeamViewer是一个能在任何防火墙和NAT代理的后台用于远程控制,桌面共享和文件传输的简单且快速的解决方案.为了连接到另一台计算机,只需要在两台计算机上同时运行 TeamV ...
- HDU 3378
http://acm.hdu.edu.cn/showproblem.php?pid=3378 规则去玩三国杀就理解了 纯模拟 注意的点:有已经分出胜负但还在杀的情况出现,所以要每次杀操作前判断是否分出 ...
- 人生苦短之我用Python篇(队列、生产者和消费者模型)
队列: queue.Queue(maxsize=0) #先入先出 queue.LifoQueue(maxsize=0) #last in fisrt out queue.PriorityQueue( ...
- [IC]Lithograph(2)光刻技术的分辨率与分辨率增强技术
接上一篇介绍IC制造的基本过程,光刻的基本过程.这篇文章继续介绍光刻过程中的一些概念. 该系列文章的目录如下: [IC]Lithograph(0)半导体制造的基本过程 [IC]Lithograph(1 ...
- Git 中文教程
以下内容转载自:http://www.open-open.com/lib/view/open1328928294702.html Git是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点 在于 ...
- Hello Pythoner!
首先,欢迎你来到pyer的博客,希望你能有所收获! 然后,pyer之前学C#(原博客地址:初行-博客园),后来转的Python,目前从事服务端研发工作. 最后,相逢便是缘,如果看过pyer的博客后有什 ...
- (转载)从MVC到前后端分离
摘要:MVC模式早在上个世纪70年代就诞生了,直到今天它依然存在,可见生命力相当之强.MVC模式最早用于Smalltalk语言中,最后在其它许多开发语言中都得到了很好的应用,例如,Java中的Stru ...
- BZOJ1013 JSOI2008 球形空间产生器sphere 【高斯消元】
BZOJ1013 JSOI2008 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点 ...
- 阿里云ECS 环境是CentOS 7.3安装mongodb3
CentOS安装mongodb https://www.cnblogs.com/zddzz/p/10069912.html CentOS安装mongodb 我的是阿里云ECS 环境是CentOS 7. ...