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)
C++中类的大小计算方法总结《网络+总结》的更多相关文章
- linux的大小端、网络字节序问题 .
1.80X86使用小端法,网络字节序使用大端法. 2.二进制的网络编程中,传送数据,最好以unsigned char, unsigned short, unsigned int来处理, unsigne ...
- 有关ARM大小端及网络字节序
http://blog.sina.com.cn/s/blog_62b250b50101ntjs.html
- VC++6.0中ClassView中类消失 解决方案[转自网络]
有时候在VC++6.0中编程会出现这样一个问题,由于对C...View类的操作后,在窗口左边ClassView框中的C...View类会消失,这种操作通常是在C...View类中右击点“Add Win ...
- C++类大小
对于C++中类的大小,主要针对于无成员的空类大小,编译器会对该类进行优化,情况主要分为是否有虚表(虚函数)两种类型,对于无虚函数的类,该类大小均为1个字节(编译器插入一个char表示该类的存在),而出 ...
- MySQL 调优基础(五) Linux网络
1. TCP/IP模型 我们一般知道OSI的网络参考模型是分为7层:“应表会传网数物”——应用层,表示层,会话层,传输层,网络层,数据链路层,物理层.而实际的Linux网络层协议是参照了OSI标准,但 ...
- [深入浅出WP8.1(Runtime)]网络编程之HttpClient类
12.2 网络编程之HttpClient类 除了可以使用HttpWebRequest类来实现HTTP网络请求之外,我们还可以使用HttpClient类来实现.对于基本的请求操作,HttpClient类 ...
- 深入分析 Java 中的中文编码问题 (文章来自网络)
许令波,developerWorks 中国网站最佳作者,现就职于淘宝网,是一名 Java 开发工程师.对大型互联网架构设计颇感兴趣,喜欢钻研开源框架的设计原理.有时间将学到的知识整理成文章,也喜欢记录 ...
- 高性能浏览器网络(High Performance Browser Networking) 第二章
第2章 TCP篇 互联网的核心是两个协议,IP和TCP. IP也叫Internet协议,提供主机到主机的路由和寻址:TCP,传输控制协议,在不可靠的传输通道上提供一个可靠的网络抽象.TCP / IP协 ...
- 巧妙设备MTU的大小,轻松提网速
MTU是什么? "MTU=最大传输单元 单位:字节" 我们在使用互联网时进行的各种网络操作,都是通过一个又一个"数据包"传输来实现的.而MTU指定了网络中可数据 ...
随机推荐
- Python -- Web -- 使用框架
Python的web框架有很多: Flask,Django,Zope2,Web.py,Web2py,Pyramid,Bottle, Tornado... Flask 轻量级,比较简单 from fla ...
- 首页商品图片显示错位,easy-popular批量上传
=============关于zencart批量商品管理的说明================== 首先,安装好批量商品管理模块,设置 /tempEP 目录可写二.确认你已经在后台增加了一些分类目录. ...
- Chapter 1 First Sight——17
Once I got around the cafeteria, building three was easy to spot. 我一走出自助餐厅,很容易看见建筑三. A large black & ...
- java中iofile的路径问题,确定一个未知方法所需要的文件路径
今天遇到一个极其烦躁的问题,一个jar包中的一个方法,要求函数中要求传入一个String类型的参数,用于指示文件所在的路径.但是对于我们来说完全不知道他需要的路径是绝对路径还是相对路径,所以我尝试了很 ...
- getWriter() has already been called for this response 的解决办法
getWriter() has already been called for this response response已经被其他对象调用了,导致无法继续使用如下 类似的方法 PrintWrite ...
- OGG 文档
[OGG]OGG的下载和安装篇 http://www.cnblogs.com/lhrbest/p/4564013.html [OGG]OGG的单向DML复制配置(一) http://www.cnblo ...
- 功能强大的HTML
HTML基本标签(一) 1.什么是HTML html:Hyper TextMakeup language:超文本标记语言 html:网页的“源码” 浏览器:“解释和执行”html源码的工具 2.网页的 ...
- 51nod 修改数组
修改数组 给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数.问最少需要修改几个数? Input 第1行:一个数N表示序列的长度(1 <= N ...
- java项目开发第六天——天若有情天亦老,人间正道是沧桑
今天讲解的东西是数据库连接,一天下来还是相对轻松的,这个组长也是够轻松的,队员加载的界面自己也是导入不了,最后也是不了了之,还是加油赶赶吧.看看严嘉那组的界面,最后就是呵呵.但是学长看完后(研究生,同 ...
- copy-on-write学习
最近知识梳理不够,那就整理点以前blog的东西.这儿就看COW(copy-on-write),cow技术主要是为了提高程序在单步操作时的系统响应速度而设计的,它通过将不是立即必要的空间分配,数据复制等 ...