vs查看虚函数表和类内存布局

摘要:
虚拟继承和虚拟基类虚拟继承:虚拟关键字的继承关系包含在继承定义中;虚拟基类:在虚拟继承系统中从虚拟继承的基类。注意:classCSubClass:publicvirtualCBase{};CBase被称为CSubClass的虚拟基类,而不是CBase是虚拟基类,因为CBase也可以是虚拟继承系统中的基类。如何在vs.中查看内存布局。打开“Visua

  虚继承和虚基类

     虚继承:在继承定义中包含了virtual关键字的继承关系;
     虚基类:在虚继承体系中的通过virtual继承而来的基类,需要注意的是:class CSubClass : public virtual CBase {}; 其中CBase称之为CSubClass的虚基类,而不是说CBase就是个虚基类,因为CBase还可以不不是虚继承体系中的基类。

vs中如何查看内存布局:

. 打开“Visual Studio Command Prompt (2010)”

使用cl命令的/d1 reportAllClassLayout或reportSingleClassLayoutXXX选项。这里的reportAllClassLayout选项会打印大量相关类的信息,一般用处不大。而reportSingleClassLayoutXXX选项的XXX代表要编译的代码中类的名字(这里XXX类),打印XXX类的内存布局和虚函数表(如果代码中没有对应的类,则选项无效)。

cl [filename].cpp /d1reportSingleClassLayout[className]  

【举例】test.cpp文件代码如下:

#include <iostream>
using namespace std;

class Base
{
public:
    int a;
    virtual void fcn() {};
};

class Derived : public Base
{
public:
    virtual void fcn2() {};
private:
    int d;
    void fcn3() { }
};

int main() 
{
}

查看Derived这个类的对象在内存中的布局,那么就可以用下面的命令行:

l Test.cpp /d1reportSingleClassLayoutDerived  

vs查看虚函数表和类内存布局第1张

    可以看到class Derived的对象的内存布局,在派生类对象的开始包含了基类Base的对象,其中有一个虚表指针,指向的就是下面的Derived::$vftable@ (virtual function table),表中包含了Derived类中所有的虚函数。

(可以看:http://www.cnblogs.com/youxin/p/3722113.html 

单一继承、多重继承:

      C++最初采用的继承模型并不运用任何间接性:即base class subobject的data members被直接放在derived class object中。这(直接复制模型)提供了对base class 最紧凑而最有效率的存取。缺点是base class members的任何改变后,所有用到此base class或其derived class的objects者必须重新编译。
c++的单一继承,多重继承采用的是直接复制,可以看到derived class的vtable里面有基类的虚函数。

  内存模型

     在这一小节里面我主要从他面试的几个题目中来谈谈虚继承的内存模型。

     代码一: 

class A
{
    virtual void a()
    {
    }
};
class A1
{
    virtual void a()
    {
    }
};

class B : public A , virtual public A1
{
};
void main()
{
    cout<<"sizeof A: "<<sizeof(A)<<endl;
    cout<<"sizeof A1: "<<sizeof(A1)<<endl;
    cout<<"sizeof B: "<<sizeof(B)<<endl; &nbsp; &nbsp; //&nbsp;
}

结果是:4,4,12

cl test.cpp /d1reportSingleClassLayoutB  

vs查看虚函数表和类内存布局第2张

        从这个内存布局就可以看出来class A、class A1和ClassB的大小,本身class A的大小应该是1bytes的内存定位大小加上虚函数指针4bytes因为有了虚函数指针后1bytes的占位就可以取消了。所以A的大小就是4bytes,同理Class A1。对于Class B它主要是从class A和class A1(虚继承)而来,所以B里面包含有一个A和A1同时因为是需继承所以就有一个指向虚基类(A1)的vbptr指针。这里为了方便我做个图直观一点:

vs查看虚函数表和类内存布局第3张

更多:http://blog.csdn.net/wangqiulin123456/article/details/8059536

 虚函数解析:http://blog.csdn.net/wangfutao01/article/details/6472291

免责声明:文章转载自《vs查看虚函数表和类内存布局》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇boost-1.53源代码编译Akka系列(九):Akka分布式之Akka Remote下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何在windows xp下实现声音内录

问题描述: 用屏幕录制软件录制一个视频,能够成功录制视频,但无法录制视频里面的声音。 问题原因: 因为现在的多数声卡,均无法直接通过声卡自身的功能实现内录和立体声混音。 这是由于声卡芯片厂商迫于RIAA(Recording Industry Association ofAmerica,美国唱片工业联合会)的压力,及维护音乐版权防止内录的需要,在新推出的声卡...

c++对象初始化中 ZeroMemory、memset、直接赋0的区别

首先是ZeroMemory和memset的区别: 1、ZeroMemory是微软的SDK提供的,memset属于C Run-time Library提供的。因此ZeroMemory只能用于Windows系统,而memset还可用于其他系统。 2、ZeroMemory是一个宏,只是用于把一段内存的内容置零,内部其实是用 memset实现的,而memset除...

(转)C++类所占内存大小计算

C++类所占内存大小计算 转载时请注明出处和作者联系方式文章出处:http://blog.csdn.net/chenchong08作者联系方式:vision_chen@yeah.net 说明:笔者的操作系统是32位的。 class A {}; sizeof( A ) = ?sizeof( A ) = 1明明是空类,为什么编译器说它是1呢?空类同样可以实例化...

html中#include file的使用方法

有两个文件a.htm和b.htm,在同一文件夹下a.htm内容例如以下 <!-- #include file="b.htm" --> b.htm内容例如以下 今天:雨 31 ℃~26 ℃ <br />明天:雷阵雨 33 ℃~27 ℃ 直接在浏览器中打开a,没有不论什么显示,后来知道,include是SSI(Server Side...

多继承和虚基类

一.多继承机制存在哪些问题,怎么解决这些问题? ——歧义性:相同名称的成员在内存中同时拥有多个拷贝,当通过派生类对象使用这些成员时,就会产生歧义性。作用域操作符虽然能解决歧义性问题,但并没有解决多个拷贝的问题。   类D 的内存布局 使用虚拟机制注意事项: 1.若在虚基类中定义了带参数的构造函数,而没有定义默认构造函数,则必须在所有的直接或间接派生类中使...

pve 启用sr-iov 待验证

pve安装intel网卡(支持sr-iov): 参考:PVE开启SR-IOV记录 https://koolshare.cn/thread-158441-1-1.htmlProxmox VE(PVE)开启IOMMO并开启网卡(82576)SRIOV功能 https://blog.csdn.net/shuye216/article/details/108942...