sizeof 统计类实例化对象所占内存大小的规则详解

本文详细介绍了C++中sizeof运算符用于计算类实例对象大小时遵循的规则,包括不考虑静态成员和函数成员,讨论了虚函数对对象大小的影响,以及编译器优化中的内存对齐填充。还提到了C++标准对空类大小的规定,并通过测试代码展示了实际占用内存的情况。
摘要由CSDN通过智能技术生成

一个类的实例化对象所占空间的大小? 注意不要说类的大小,是类的对象的大小。 
首先,类的大小是什么?确切的说,类只是一个类型定义,它是没有大小可言的。 用sizeof运算符对一个类型名操作,得到的是具有该类型实体的大小。add charles 空结构体:struct d{} 的sizeof也是1。

具体规则如下:

1:sizeof统计的是内存四区中的堆和栈里面的数据,而不包含数据区和代码区,因此并不统计static静态成员(因为static成员是存储在数据区,且static成员是属于整个类的,而不专属于某一个对象)  和  函数成员( 因为类中的函数在调用的时候,直接加载到代码段,而不会分配内存空间 ) ;

2:sizeof(A)的大小和成员的大小总和是什么关系呢,很简单,一个对象的大小大于等于所有非静态成员大小的总和。 
为什么是大于等于而不是正好相等呢?超出的部分主要有以下两方面: 
1)  C++对象模型本身 对于具有虚函数 (不论虚函数的个数) 的类型来说,在实例化对象时,编译器会自动在对象中插入一个指向虚函数表的指针,占四个字节;而如果这个类是多继承的话,且继承的每个父类都是虚函数,则有几个父类,则会产生几张虚函数表,对应的会有几个相应的指针。

2)  编译器优化 因为对于大多数CPU来说,CPU字长的整数倍操作起来更快,因此对于这些成员加起来如果不够这个整数倍,有可能编译器会插入多余的内容凑足这个整数倍,此外,有时候相邻的成员之间也有可能因为这个目的被插入空白,这个叫做“补齐”(padding)。

3)C++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值