C++ 类的大小计算

class A
{
};

class B
{
	char ch;
	virtual void func0()  {  }
};

class C
{
	char ch1;
	char ch2;
	virtual void func()  {  }
	virtual void func1()  {  }
};

class D : public A, public C
{
	int d;
	virtual void func()  {  }
	virtual void func1()  {  }
};

class E : public B, public C
{
public:
	int e;
	virtual void func0()  {  }
	virtual void func1()  {  }
	//子类里(E)没有实现func(),所以在E的子类里B的vfptr指向C的func()和E的func1()
	virtual void func123()  {  }
}

int main()
{
        //result=1,空类,大小为1
        cout << "A=" << sizeof(A) << endl;
        
        //result=8,4(vfptr,4)+4(char ch,内存对齐,4) = 8       
	cout << "B=" << sizeof(B) << endl; 
	  
	//result=8 , 4(vfptr,4)+4(char ch1,char ch2,内存对齐,4) = 8  
	cout << "C=" << sizeof(C) << endl;    

	//result=12, 4(类D的vfptr,4)+4(存在基类的char ch1,char ch2,内存对齐,4)+4(int d) = 12
	D obj_d; //首先VPTR指向的虚函数表中保存的是类D中的两个虚函数的地址
	cout << "D=" << sizeof(obj_d) << endl;    

	//result=20,(多继承)继承多少个有虚函数的类,就有多少个虚函数指针,也即这几个虚函数指针组成了自己的vfptr(编译器不再单独给自己的虚函数插vfptr)
	//4(B的vfptr)+4(char ch)+4(C的vfptr)+4(C中 char ch1,char ch2)+4(E 中int d) = 20
	//这个可以从调试下看出来
	E obj_e;
	obj_e.e = 123;
	cout << "E=" << sizeof(obj_e) << endl;    

        return 0;
}
时间: 2024-10-11 05:04:26

C++ 类的大小计算的相关文章

c++类的大小

做题的时候发现一个题目求类的sizeof()大小,复制了网友的解答: #pragma pack(2) class BU { int number; // 4 union UBffer { char buffer[13]; // 13 int number; // 4 }ubuf; // union的大小取决于它所有的成员中,占用空间最大的一个成员的大小,并且需要内存对齐,这里因为#pragma pack(2),所以union的大小为14,如果不写#pragma pack(2),那么union大小

C++类所占内存大小计算

C++类所占内存大小计算 转载时请注明出处和作者联系方式文章出处:http://blog.csdn.net/chenchong08作者联系方式:[email protected] 说明:笔者的操作系统是32位的. class A {}; sizeof( A ) = ?sizeof( A ) = 1明明是空类,为什么编译器说它是1呢?空类同样可以实例化,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所

C++中虚函数工作原理和(虚)继承类的内存占用大小计算

一.虚继承情况下类的内存大小计算 当每个基类中有多个虚函数时,并且在虚继承的情况下,内存是如何分配的,如何计算类的大小,下面举例说明: #include<iostream> using namespace std; class A { public: int a; virtual void aa(){}; }; class D { public: virtual void dd(){}; }; class C { public: virtual void cc(){}; }; class B

sizeof求类的大小

用sizeof求类的大小,http://blog.csdn.net/szchtx/article/details/1025400,这篇博文给出了非常详尽的举例介绍. 但是细心的我还是发现了一个小瑕疵,那就是对如下例子求sizeof(B),在VS下是16不是12! class A { public: int a; private: char b; }; class B : public A { public: int d; char c; }; 以下是我根据上机实验结果,总结的精华要点,希望从此以

[Android Memory] Shallow Heap大小计算释疑

转载自:http://blog.csdn.net/sodino/article/details/24186907 查看Mat文档时里面是这么描述Shallow Heap的:Shallow heap is the memory consumed by one object. An object needs 32 or 64 bits (depending on the OS architecture) per reference, 4 bytes per Integer, 8 bytes per

java对象占用内存大小计算方式

案例一: User public class User { } UserSizeTest public class UserSizeTest { static final Runtime runTime=Runtime.getRuntime(); public static void main(String[] args) { final int count = 100000; User[] us=new User[count]; long heap1 = 0; for (int i = -1;

关于虚拟继承类的大小问题探索,VC++ 和 G++ 结果是有区别的

昨天笔试遇到个 关于类占用的空间大小的问题,以前没怎么重视,回来做个试验,还真发现了问题,以后各位笔试考官门,出题时请注明是用什么编译器. vc6/vc8 cl 和 Dev-C 的g++ 来做的测试: 上代码, 测试代码: #include <stdio.h>class A{public: int x;  int y; A() {  x = 1;     y = 2; }; void go() {  printf("A go()\n"); }    virtual void

Java对象的内存布局以及对象所需内存大小计算详解

1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): 对象头又可以分为两部分: 第一部分用来存储对象自身的运行时基本数据信息.如哈希码.GC分代年龄.锁状态标示.线程持有的锁等.这部分数据的长度在32bit和64bit虚拟机上分别为32bit和64bit.官方称呼是"Mark Word". 第二部分是类型指针,或者说指向类的元数据信息的引用.

C++中怎么求类的大小?以及内存对齐原理(面试官经常问到的问题)

<pre name="code" class="cpp">#include<iostream> using namespace std; int main(){ class S{}; cout<<sizeof(S); return 0; } 程序居然输出为1!到底是怎么回事?首先我在这里要声明一点--类在未初始化之前确实不会分配空间,这里探讨的是sizeof(类)的问题,详细情况看下面的例子 C++中的类所占内存空间总结 类所占内