C++中类的大小计算方法总结《网络+总结》
C++中类的成员函数,静态成员是不占类的大小的。类的大小等于基类的大小+子类个non-static成员变量的大小再+非虚基类大小,如果有多态性还要考虑vptr(可能不止一个)大小,这里成员变量是会被字节对齐的。
1、空类的大小为1字节
2、字节对齐的问题
成
员变量需要整齐的存储,所以若是有不同类型的变量(本身占用字节数不同),则所有变量的大小会按照最大的的大小进行补齐,比如说,若是一个类中有个
bool型和int型,则bool型也会占用4个字节。若最大的为short,则bool型或者char型会补齐成为2个字节,最大的为double,则
都补齐成为8字节。
并且即使成员完全相同但排列不同计算出的类的大小也可能完全不同。
如下例:
一个类的大小可以被下面的方式改变:
class A
{
bool a;
int b;
bool c;
}; //sizeof (A) = 12
这个结果可能会让你吃惊,因为A的成员总数是6个字节:1+4+1个字节。那另6字节是哪儿来的?编译器在每个bool成员后面都插入了3个填充字节以保证每个成员都是按4字节排列,以便分界。你可以减少A的大小,通过以下方式:
class B
{
bool a;
bool c;
int b;
}; // sizeof (B) = 8
这一次,编译器只在成员c后插入了2个字节。因为b占了4个字节,所以就很自然地把它当作一个字的形式排列,而a和c的大小1+1=2,再加上2个字节就刚好按两个字的形式排列B。
3、虚函数:如果有虚函数,类的大小+4个字节。(用来存放vptr)
例:
class A
{
virtual void foo();
int i;
char c;
}; sizeof(A) = 12 = vptr + sizeof(i) + (sizeof(c) +3);
class B :public A
{
void foo1();
static int haha;
long ll;
} sizeof(B) = 16 = sizeof(A) + sizeof(ll);
4、虚基类指针:如果是虚继承,则子类的大小为:虚基类的大小 + 4个字节(用来存放指向虚基对象的指针)+子类新增成员的大小。
例:
class A
{
virtual void foo(){};
int i;
int j;
};
class C: virtual public A
{
char sz[10];
};sizeof(C) = sizeof(A) + 4 + sizeof(sz[10]) = 12+4+10+2(补齐sz)=28
5.静态成员变量不占用类的空间,它存储在静态区域。
6.类的成员函数地址存储在代码区域,所以不占字节。(虚函数除外,+4)
最新文章
- TNS-12535: TNS:operation timed out案例解析
- 超炫数字特效动画AE模板
- 关于Log和adb知识
- 省市区县镇级联数据JS版
- linux命令行快捷键
- Spring Batch的事务-Part 1:基础
- liunx下vi命令详解
- eclipse插件hibernate tools安装 爱好者
- Poj OpenJudge 百练 Bailian 1008 Maya Calendar
- Excel2010: Excel使用小技巧(不断更新)
- REDHAT、CenterOS使用安装Linux系统时的光盘镜像来安装软件
- mysql count max min 语句用法
- EasyUI datagrid 使用小结
- [POJ 3243]Clever Y
- MYSQL 表左连接 ON AND 和ON WHERE 的区别
- 使用 FFT 进行频谱分析
- MySQL高可用方案-PXC(Percona XtraDB Cluster)环境部署详解
- [PHP] 链表数据结构(单链表)
- 记一次寻找appbug的问题
- LuaCURL
热门文章
- 在ubuntu server 上记录和查看cron日志
- Chapter 1 First Sight——15
- Chapter 1 First Sight——11
- GridView规则显示图片
- Mysql获取去重后的总数
- C#入门经典第八章面向对象编程-3-Windows应用程序中的OOP
- c# 动态产生控件 注册动态控件事件
- css中margin重叠和一些相关概念(包含块containing block、块级格式化上下文BFC、不可替换元素 non-replaced element、匿名盒Anonymous boxes )
- 同时运行ecstore1.2与ecstore2.0的解决方案
- springMVC和spring的集成