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++中虚函数工作原理和(虚)继承类的内存占用大小计算

原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一、虚函数的工作原理       虚函数的实现要求对象携带额外的信息,这...

c++中类的大小和虚函数调用顺序

声明了一个父类一个子类。 class father { public: father(); ~father(); virtual int getAge(); private: int m_a...

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

一、虚函数的工作原理       虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table po...

C++中类的大小计算方法总结

C++中类的成员函数,静态成员是不占类的大小的。类的大小等于基类的大小+子类个non-static成员变量的大小再+非虚基类大小,如果有多态性还要考虑vptr(可能不止一个)大小,这里成员变量是会被字...

C++类的大小研究-SIZEOF-虚函数-虚表

在笔试的时候遇到了C++类本身的大小的题目,已经记不住原题了,现在那几个简单的

C++中空类和空结构体大小的问题?

问题的提出有一个空类A,sizeof(A)=? 这个问题在笔试中经常遇到,答案是多少呢?class A { };代码求解#include "stdafx.h" #include using name...

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

原文地址:http://blog.csdn.net/hackbuteer1/article/details/7883531 一、虚函数的工作原理       虚函数的实现要求对象携带额外的信息,这...

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

一、虚函数的工作原理       每当创建一个包含有虚函数的类或从包含有虚函数的类派生一个类时,编译器就会为这个类创建一个虚函数表(VTABLE)保存该类所有虚函数的地址,其实这个VTABLE的作用...

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

一、虚函数的工作原理       虚函数的实现要求对象携带额外的信息,这些信息用于在运行时确定该对象应该调用哪一个虚函数。典型情况下,这一信息具有一种被称为 vptr(virtual table p...

C++类的实例化后占内存的大小计算

闫一伟  2010-04-06     在初学面向对象的程序设计语言时,很多人或多或少的都有些疑问,为什么写出来的代码与最终生编译成的代码大相径庭呢?我们并不知道编译器在后台做了什么工作,这些都是由于...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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