本文主要是介绍C++ class的各种sizeof,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
测试环境 visual express 2013
// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include<iostream>
using namespace std;class hollow //size 1,为了在内存中给其对象分配一个独一无二的地址,编译器自动给其增加一个char成员变量
{};
class A //size 4,编译器给其增加一个vptr变量,指向虚函数表vtbl
{
public:virtual void print(){ cout << "A" << endl; }
};
class B :public A //size 4,
{};
class C :public A //size 4,只是为了证明类只维护一个vptr,而不会继承子类的vptr,这句话只在使用简单继承时成立//多重继承的时候,派生类有和子类个数相同的vptr
{virtual void print(){ cout << "C" << endl; }
};//虚继承
class C1 //size 4
{int a;
};
class V1 :virtual public C1{}; //size 8 //一个C1大小和一个vbptr指针的宽度,vbptr指向一个表格,表格内存储的是虚基类距离和派生类的相对地址偏移
class V2 :virtual public C1{}; //size 8 //同上
class V3 :public V1, public V2{};//size 12 //一个V1大小+V2大小-C1,因为派生类中只保存一份虚基类的实体//虚继承
class VC1 //size 8一个int 大小和一个vptr指针大小
{int a;virtual void print();
};
class VV1 :virtual public VC1{ virtual void print(); }; //size 12 一个VC1大小+一个vbptr指针宽度
class VV2 :virtual public VC1{ virtual void print(); }; //同上
class VV3 :public VV1, public VV2{ virtual void print(); };//VV1+VV2-VC1,需要注意的是VV1,VV2各含有一个vptrclass Base
{
public:int a;int b;
};void offset_test()
{int Base::* offsetA = &Base::a;int Base::* offsetB = &Base::b;}
int _tmain(int argc, _TCHAR* argv[])
{V1 c1;printf("%d", &Base::b);cout << "size of C1 is " << sizeof(C1) << endl;cout << "size of V1 is " << sizeof(V1) << endl;cout << "size of V2 is " << sizeof(V2) << endl;cout << "size of V3 is " << sizeof(V3) << endl;cout << "size of VC1 is " << sizeof(VC1) << endl;cout << "size of VV1 is " << sizeof(VV1) << endl;cout << "size of VV2 is " << sizeof(VV2) << endl;cout << "size of VV3 is " << sizeof(VV3) << endl;cout << sizeof(hollow) << endl;cout << sizeof(A) << endl;cout << sizeof(B) << endl;cout << sizeof(C) << endl;return 0;
}
这篇关于C++ class的各种sizeof的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!