c++类大小问题

1.空类

class A
{
};

sizeof(A); //1

解析:类的实例化就是为每个实例在内存中分配一块地址;每个类在内存中都有唯一的标识,因此空类被实例化时,编译器会隐含地为其添加一个字节,以作区分。

2.虚函数类

class A
{
    virtual void Fun();
};

sizeof(A); //4

解析:当一个类中包含虚函数时,会有一个指向其虚函数表的指针vptr,系统为类指针分配大小为4个字节(即使有多个虚函数)。

3.普通数据成员

class A
{
    int a;
    char b;
};

sizeof(A); //8

解析:普通数据成员,按照其数据类型分配大小,由于字节对齐,所以a+b=8字节。

4.静态数据成员

class A
{
    int a;
    static int b;
};

sizeof(A); //4

解析:静态数据成员存放的是全局数据段,即使它是类的一个成员,但不影响类的大小;不管类产生多少实例或者派生多少子类,静态成员数据在类中永远只有一个实体存在。而类的非静态数据成员只有被实例化时,才存在,但类的静态数据成员一旦被声明,无论类是否被实例化,它都已存在,类的静态数据成员可以说是一种特殊的全局变量。

5.普通成员函数

class A
{
    void Fun();
};

sizeof(A); //1

解析:类的大小与它的构造函数、析构函数以及其他成员函数无关,只与它的数据成员相关。

6.普通继承

class A
{
    int a;
};

class B:public A
{
    int b;
};

sizeof(B); //8

解析:普通类的继承,类的大小为本身数据成员大小+基类数据成员大小。

7.虚函数继承

virtual class A
{
    int a;
};

class B:virtual public A
{
    int b;
};

sizeof(B); //12

解析:虚函数类的继承,派生类大小=派生类自身成员大小+基类数据成员大小+虚拟指针大小(即使继承多个虚基类,也只有一个指向其虚函数表的指针vptr,大小为4字节)。

时间: 2024-10-29 19:11:30

c++类大小问题的相关文章

sizeof 和类继承 虚继承 求类大小

代码: #include <iostream> using namespace std; /* class a{ float k; // 4字节 virtual void foo(){} //有一个4字节的指针指向自己的虚函数表 }; class b : virtual public a{ virtual void f(){} }; 有这样的一个指针vptr_b_a,这个指针叫虚类指针,也是四个字节:还要包括类a的字节数,所以类b的字节数就求出来了. 运行结果: 8 16 */ /* clas

【整理】C++虚函数及其继承、虚继承类大小

参考文章: http://blog.chinaunix.net/uid-25132162-id-1564955.html http://blog.csdn.net/haoel/article/details/1948051/ 一.虚函数与继承 1.空类,空类单继承,空类多继承的sizeof #include <iostream> using namespace std; class Base1 { }; class Base2 { }; class Derived1:public Base1

C++类大小的计算

这里记录一下怎么计算类对象的大小. 大概总结下,类的大小需要考虑以下内容: 非静态成员变量大小 数据对齐到多少位 有无虚函数(即需不需要指向虚函数表的指针,如果考虑继承的情况,则还需要看继承了多少个指向虚函数表的指针) 非静态成员变量大小 空类 首先我们看什么都没有的时候的例子: class test{ }; 可以看到,类实例化的对象的大小为1.这是因为即使类是空白类,编译器也会分配一个字节的空间来占位,用来和真正的空白/空变量区别开来(毕竟实例化其实就是分配一定的内存空间,如果没有分配空间,那

C++空类大小

class a {};class b{};class c:public a{ virtual void fun()=0;};class d:public b,public c{}; 类a,b明明是空类,它的大小应该为为0,为什么 编译器输出的结果为1呢?这就是我们刚才所说的实例化的原因(空类同样可以被实例化),每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址.所以a,b的大小为1. 而类c是由类a派生而

sizeof操作符-结构体与类大小

导读 sizeof是C/C++一个难点,当在自定义类上应用sizeof操作符时,总会出现意想不到的结果,下面,我们就来探讨一下sizeof这个操作符! 目录 1. sizeof与strlen的区别 2. sizeof作用于结构体 3. 字节对齐问题 4. sizeof作用于类 正文 1. sizeof与strlen的区别 这是老生常谈的问题了,下面举一个例子大家就明白了. char buf[] = "hello world!"; cout<<sizeof(buf)<&

Integer 包装器类 大小比较

今天做功能,处于小心的习惯,打印了一下两个Integer比较的语句,发现了一个问题: 为了防止不小心掉入这样的陷阱,对于基本类型的比较,用“==”:而对于基本类型的封装类型和其他对象,应该调用public boolean equals(Object obj)方法(复杂对象需要自己实现equals方法). 参考:http://angelinafan.blog.163.com/blog/static/1361727982011224112444751/

由于jsp include 很多文件后导致java类大小超过65535 bytes 的解决方法(转载)

昨天,我遇到了一個讓我很頭疼的問題. 我做了一個共通的jsp,單只測它是ok的,可是,放在別的jsp中include它,就會報錯如標題所示:The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit.調用它的jsp是這樣寫的:< %@include file="/模塊名/nani_include.jsp" % > .于是我

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; }; 以下是我根据上机实验结果,总结的精华要点,希望从此以

空类,含有虚函数的类的大小

1.为何空类的大小不是0呢? 为了确保两个不同对象的地址不同,必须如此. 类的实例化是在内存中分配一块地址,每个实例都有独一无二的内存地址.空类也会实例化,为保证空类实例化后的独一无二性,编译器会给空类隐含的添加一个字节.所以,空类的sizeof为1,而不是0. 2.继承关系中的类大小: case 1: 父类有虚函数,子类继承. class A{ virtual void f(){} }; class B:public A{} 此时,类A和类B都不是空类,其sizeof都是4,因为它们都具有虚函