C++类的大小(sizeof)

C++ sizeof 计算大小 虚函数 虚继承 虚基 虚函数表 文章目录c++大小计算关于/对象大小的计算一.简单情况的计算二.空大小三.含有虚函数成员(1)在派生中不对基的虚函数进行覆盖,同时派生中还拥有自己的虚函数在派生中对基的虚函数进行覆盖(3)多继承:无虚函数覆盖(4)多重继承,含虚函数覆盖四.虚继承的情况 c++大小计算 c++所占的大小计算并没有想象中那么简单,因为涉及到虚函数成员,静态成员,虚继承,多继承以及空等,不同情况有对应的计算方式,在此对各种情况进行总结。 首先要明确一个概念,平时所声明的只是一种型定义,它本身是没 阅读详情

1、空类

class Base {};

sizeof(Base)等于1。Base是一个空类,类在进行实例化的时候就是给一个实例分配一块内存,对一个空类进行实例化的时候,同样需要分配一块内存,编译器默认分配一个字节大小的内存给空类实例,所以空类的大小为一个字节。

2、一般非空类

class Base {
    int val;
    char ch;
};

sizeof(Base)等于8。Base包含了两个数据成员,类型为int和char,分别占用4个字节和1个字节,根据内存对齐的原则,Base大小为8个字节。

3、包含普通成员函数的一般非空类

class Base {
    int val;
    char ch;
    void fun(){}
};

sizeof(Base)等于8。类的大小只与它的数据成员有关,与普通成员函数、构造函数、析构函数无关。

4、包含虚函数的类

class Base {
    int val;
    char ch;
    virtual void fun(){}
};

sizeof(Base)等于12。Base定义了一个虚函数,编译时会生成虚函数表,该类型的实例都包含一个指向虚函数表的指针,这个指向虚函数表的指针保存在实例内存中的最前面的位置,根据内存对齐的原则,Base的大小为12个字节。

5、包含静态数据成员的类

class Base {
    int val;
    char ch;
    static int num;
};

 sizeof(Base)等于8。因为静态数据成员保存在全局静态数据区,该类型的所有实例共享同一个静态数据成员,静态数据成员只分配一次内存。因此,Base的大小为8个字节。

6、单继承的类

class Base {
    int val;
    char ch;
};
class Derive: public Base {
    char c;
};

 sizeof(Derive)等于12。Base的大小为8个字节,内存对齐值为4个字节,因此在Derive中相当于包含两个成员,类型分别为Base、char,根据内存对齐,对齐值为4,Derive的大小为12个字节。

 

sizeof浅析(三)——求大小 sizeof大小和求结构体的大小,有一定的相似性,但又不完全相同,因为存在这继承和派生、存在着虚函数。 1、空大小 对于一个空,使用sizeof求得其大小为1。 2、简单 如下定义一个, class A { public: int a; private: char b; };         使用sizeof求这种简单,结果和求结构体的sizeof是一 阅读详情

相关推荐

C++】多态的原理

虚函数表 //这里常考一道笔试题:sizeof(Base)是多少? /* 这里 sizeof(Base) = 8。 int型4个字节 + virtual中含一个指针:4个字节 = 8个字节 (无论有几个虚函数,只有一个指针,指针指向虚函数表) */ class Base { public: //若不加virtual,则sizeof(Base) = 4,此时不计算函数大小 virtual...

ZD_012的博客 355

C++大小详尽讲解

C++大小,是一个比较经典的问题,学过C++后,应该对大小有清晰的认识,长话短说,本文精简凝练,我们进入正题!!! 1 大小与什么有关系? 与大小有关的因素:普通成员变量,虚函数,继承(单一继承,多重继承,重复继承,虚拟继承) 与大小无关的因素:静 态成员变量,静态成员函数及普通成员函数 2 空即什么都没有的,按上面的说法,照理说大小应该是0,但是,空大小为1,因为空可以实例化,实例化必然在内存中占有一个位置,因此,编译器为其优化为一个字节大小。 某继承自空

StudyWinter的博客 4487

C++中虚继承sizeof大小

参考文献:《深度探索C++对象模型》 运行平台:Visual Studio 2015 最近在研读大佬Lippman的《深度探索C++对象模型》,对其中的虚继承sizeof大小产生了兴趣,因此编码测试了一下。 1. 基为空 废话不说,先上源码: # include <iostream> using namespace std; class X { }; clas...

m0_38014304的博客 1978

C++ 通过继承的多态实现原理以及虚函数表改写时机

class Parent{ public: virtual void func() { cout << "Parent" << endl; } }; class Child : public Parent{ public: void func_child() { cout << "func_child" << endl; } void func() { cout << "Child" << endl; } }; int

欢迎你来 415

C++大小——sizeof()

先看这么个问题——已知:class CBase{    int  a;    char *p;};那么运行cout这个应该很简单,两个成员变量所占的大小有嘛——8。可由时候人就是爱犯这个错误:这么简单的问题人家会问你?再想想……好像C++里面有个什么函数指针,也应该占字节吧!?什么指针来着?忘了(还是水平低不扎实)!流汗中……算了姑且认为是构造函数和析构函数吧。一人一个加上刚

北漂民工 1万+

C++大小——sizeof(class)

第一:空大小 class CBase { }; 运行cout&amp;lt;&amp;lt;&quot;sizeof(CBase)=&quot;&amp;lt;&amp;lt;sizeof(CBase)&amp;lt;&amp;lt;endl; 输出 sizeof(CBase)=1; 为什么空的什么都没有是1呢? 先了解一个概念:的实例化,所谓的实例化就是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样空也会被实例

Hello World 3291

c++sizeof大小 sizeof与strlen对比

1.空大小为1个字节,参看下面实例 class A {}; int main(int argc, char const *argv[]) { A a; cout<<"A sizeof is: "<<sizeof(a)<<endl; return 0; } 代码输出结果为 A sizeof is: 1 为什么空大小不为0?主要是为了确保两个不同对象地址不同,必须如此。 的实例化是在内存中分配一块地址,每个实例在内存中都有一块不同地

bitcarmanlee的博客 1718

C++ sizeof大小

1空 class A {}; 大小为1。 的实例化就是给每一个实例在内存中分配一块地址。空被实例化时,会由编译器隐含的添加一个字节。所以空的size为1。 2 虚函数 class A { public: virtual void fun() {}; virtual void fun2() {}; }; 大小为4。 当C++中有虚函数的时候,会有一个指向虚函数表(V-

zhengjihao的博客 6581

C++中有关用sizeof()大小

问题 当一个是空的,及既无构造函数又无析构函数,用sizeof()求其大小? 若中只有构造函数和析构函数,此时用sizeof()求其大小? 若中定义了虚析构函数,此时用sizeof()求其大小是多少? class base {}; class base1 { public: base1(){}; ~base1(){}; } clss base2 { public: base2(...

weixin_36323170的博客 592

【转】C++sizeof大小

转自https://blog.csdn.net/zhengjihao/article/details/77825269 其中有的描述与实际GCC上执行的结果不符,不过其中的分析思路需要掌握。 以下是GCC的实际执行结果: 1 #include <iostream> 2 using namespace std; 3 4 int *pointer; ...

weixin_30240349的博客 116

C++sizeof大小浅析】

izeof求大小和求结构体的大小,有一定的相似性,但又不完全相同,因为存在这继承和派生、存在着虚函数。 1、空大小 对于一个空,使用sizeof求得其大小为1。 2、简单 如下定义一个, class A { public: int a; private: char b; }; 使用sizeof求这种简单,结果和求结构体的sizeof是一样的,需要考虑...

ptrunner的专栏 599

C++虚继承与其他继承sizeof()大小详解

先看这么个问题——已知: class CBase { int  a; char *p; }; 那么运行cout 这个应该很简单,两个成员变量所占的大小有嘛——8。可由时候人就是爱犯这个错误:这么简单的问题人家会问你?再想想……好像C++里面有个什么 函数指针,也应该占字节吧!?什么指针来着?忘了(还是水平低不扎实)!流汗中……算了姑且认为是构造函数和析构函数吧。一人

3469

C++大小——sizeof()(转载)

2009-09-11 10:25:03|  分C++语法 |字号 订阅 先看这么个问题——已知: class CBase { int  a; char *p; }; 那么运行cout 这个应该很简单,两个成员变量所占的大小有嘛——8。可由时候人就是爱犯这个错误:这么简单的问题人家会问你?再想想……好像C++里面有个什么 函数指针,也

androidwifi的专栏 400

sizeof计算C++大小

原文地址

wqy19920429的专栏 641

c++ sizeof大小

/* * - 空大小为1字节 * - 静态数据成员被编译器放在程序的一个global data mnembers中,它是的一个数据成员,但不影响大小;不管这个产生了多少个实例, * 还是派生了多少新的,静态数据成员只有一个实例;静态数据成员,一旦被声明,就已经存在。 * - 对于包含虚函数的,不管有多少个虚函数,只有一个虚指针,vptr的大小。 * - 普通单继承,继承就是基+派生自身的大小(字节对齐)。 * - 虚单继承,派生继承基vptr */ #include<i.

wwhhhhll的博客 516
上一篇: C++单例,线程安全,资源释放
下一篇: C++菱形继承、虚继承
boom!!!
博客等级 码龄8年 1粉丝 13原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值