C++类的大小

原创 2012年03月24日 20:11:07

一、类的大小与对象的大小

类只是一种类型,没有大小可言。使用sizeof得到的大小,只是它的实例化对象的大小。所以类的大小与对象的大小是一样的。

class Base
{
private:
    int a;
    int b;
};

void main()
{
   Base base;
   int objSize = sizeof(base);
   int classSize = sizeof(Base);
   cout << objSize << endl; // 8
   cout << classSize<< endl; // 8
}

二、空类的大小

一个类什么都没有定义,它的大小不是0,而是1。

类的实例化,所谓类的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。第一点说到类的大小跟对象大小一样,所以空类的大小是1.

class Base
{
};
int size = sizeof(Base);  // size == 1

三、类成员变量

如果一个类有类成员变量(static修饰的成员变量),那么类的大小又应该怎么算呢?类的大小其实就是对象的大小,类成员不属于对象,所以类的大小也不包括类成员变量。

class Base
{
public:
	Base(){};
	void f();
private:
	int a;
	int b;
	static int sc;
};

int size = sizeof(Base); // size == 8
四、子类的大小

子类继承父类,所以子类的大小等于父类的大小加上自己定义的成员变量的大小。

class Base
{
public:
	Base(){};
	void f();
private:
	int a;
	int b;
	static int sc;
};

class Derived : public Base
{
	int d;
};

int derivedSize = sizeof(Derived);  // derivedSize == 12

四、带有虚函数的类的大小

类的普通函数不算类的大小,虚函数稍微复杂些。虚函数本身也不计算大小,但是虚函数表计算大小。类只要有虚函数就有虚函数表,在类里面有一个指针指向虚函数表。这个指针大小是4,所以具有虚函数的类它的大小要在原来基础上加4。但是不管有多少个虚函数,都只加4。(多重继承例外)

class Base
{
public:
	Base(){};
	virtual void f();  // 三个虚函数,类的大小只增加4
        virtual void g();
        virtual void h();
private:
	int a;
	int b;
};

int size = sizeof(Base);  // size == 12

五、具有虚函数的子类的大小

具有虚函数的子类的大小,其虚函数指针也是4,所以大小在原基础上加4。以下例子,虽然Child和GrandChild都定义了自己的虚函数,但是类的大小跟父类一样只增加4。

class Base
{
public:
	Base(){};
	virtual void f();
	virtual void g();
	virtual void h();
private:
	int a;
	int b;
	static int sc;
};

class Child : public Base
{
public:
	virtual void f();
	virtual void m(); //Child 的虚函数
};

class GrandChild : public Child
{
public:
	virtual void f();
	virtual void n();  // GrandChild 的虚函数
};
int base= sizeof(Base);               // 12
int child = sizeof(Child);            // 12
int grandchild = sizeof(GrandChild);  // 12
六、注意补齐

为了便于访问数据,编译器会对数据进行补齐。不举例子了。




c++类的大小计算

c++中类所占的大小计算并没有想象中那么简单,因为涉及到虚函数成员,静态成员,虚继承,多继承以及空类等,不同情况有对应的nisan方式,在此对各种情况进行总结。 首先要明确一个概念,平时所声明的类只是...
  • fengxinlinux
  • fengxinlinux
  • 2017年06月01日 23:01
  • 1883

C++空类的大小

C++空类的大小为什么不为0?先来看测试程序的输出。#include using namespace std;class NoMembers { };int main() { NoMembe...
  • lihao21
  • lihao21
  • 2015年10月04日 07:41
  • 3463

C++类对象大小的计算(二)含有虚函数类大小计算

以下内存测试环境为Win7+VS2012
  • gongtxy
  • gongtxy
  • 2014年10月01日 15:54
  • 960

C++类的实例化对象的大小之sizeof()

C++类的实例化对象的大小之sizeof()
  • houqingdong2012
  • houqingdong2012
  • 2014年10月19日 20:02
  • 2226

C++ 习题 比较大小-类模板

/* Description 声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数。说明:在类模板外定义各成员函数。 Input 输入两个整数、两个浮点数和两个字符 Output...
  • u012369559
  • u012369559
  • 2014年06月21日 14:02
  • 777

C++中类所占内存空间大小

学习虚继承知识的时候,无意中发现了关于C++类所需内存的面试题,通过sizeof()计算类所需的内存字节数。当时自己就懵了, 因为学习C++的时候,就知道类在声明时是不会分配内存空间的还以为自己学习的...
  • lovebird_27
  • lovebird_27
  • 2015年12月21日 16:18
  • 2002

从3个程序理解C++类实例大小

程序1: #include using namespace std; class a{}; class b{}; class c:public a{ virtual void fun()=0; ...
  • xyw_Eliot
  • xyw_Eliot
  • 2014年02月20日 21:27
  • 1001

C++中一个类对象占用的内存空间大小

一个class对象需要占用的内存空间大小,最权威的结论是: 非静态成员变量总合加上编译器为了CPU计算,作出的数据对齐处理加上为了支持虚函数,产生的额外负担 可以分为基类和派生类两种情况来...
  • XJF199001
  • XJF199001
  • 2015年09月29日 20:03
  • 1050

关于C++ 中大小端和位域

关于C++中的大小端、位段(惑位域)和内存对齐   听到好几个朋友说到去一些公司做面试,总是遇到关于大小端、位段(或者叫位域)和内存对齐的考题,然后就不知所措了。虽然我认为很多开发根本就用不到这...
  • luoye7422
  • luoye7422
  • 2015年03月22日 23:22
  • 799

C++类中包含stl容器时,使用sizeof求大小的问题

这里的大小指的是sizeof(a class object)的值,也就是一个类的对象所占的字节大小,原来我一直认为类的大小会随着类成员中容器元素个数的变化而变化,后来想想又想不通,所以写了下面的代码用...
  • shihengzhen101
  • shihengzhen101
  • 2015年11月18日 22:45
  • 1334
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++类的大小
举报原因:
原因补充:

(最多只允许输入30个字)