C++类字节对齐
来源:互联网 发布:win7右下角网络感叹号 编辑:程序博客网 时间:2024/06/05 12:49
在c语言中,结构体有字节对齐,c++中的类也有字节对齐。在c++里的字节对齐和struct里类似下面我们看看字节对齐的规则和许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4的倍数,这就是所谓的字节对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐要求比T强(严格),而称T比S弱(宽松)。下面来讨论4种不同类型的
对齐模数:
内置类型的自身对齐模数(有符号无符号相同)
char 1
short 2
int 4
float 4
double 8
自定义类型的自身对齐模数(struct 、class)
等同于其成员中最大的自身对齐模数 指定对齐模数
我们给编译器指定的对齐模数(在VC中使用指令:#pragma pack(n),如果不指定,在VS2010默认为8)
有效对齐模数 指定对齐模数与类型自身对齐模数的较小的值,就是实际生效的对齐模数。
字节对齐三规则:
其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
在C++类里在没有任何数据类型变量的时候,会有一个字节的空间占用,如果有数据类型变量就会有字节对齐,例如:
输出为八个字节,首相类开始占空间大小是数据类型最大类型四个字节,下面是数据类型来说,int类型是四个字节,是char类型的整数倍,二者一加是五个字节,五个字节不是刚开始类占用空间四个字节的整数倍,这里就需要对齐,比五大四的最小整数倍是8个字节,其他字节对齐和该例子一样。
还有一种是最容易忽略的就是有虚函数的时候也会占用4个字节的空间,
在这里可以看到,当有虚函数的存在时候会占用四个字节的空间,原因是因为如果有虚函数存在在构造对象的时候会多构造一个虚指针。
- C/C++字节对齐
- C/C++字节对齐
- c/c++字节对齐
- C/C++字节对齐
- c/c++字节对齐
- C语言字节对齐
- C语言字节对齐
- C/C++字节对齐
- c语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- C语言字节对齐
- Oracle表空间与数据结构
- Android7.0中文文档(API) -- TimePicker
- 我要做Android开发,第一天,开始
- 生成Context.cs文件里 找不到这个命名空间 “System.Data.Entity.Infrastructure”。
- 34 WebGL物体的点光源的效果(逐顶点处理光源光照效果)
- C++类字节对齐
- 昂贵的聘礼 POJ
- 【算法题】地牢逃脱
- [Spark]那些年我们遇到的Spark的坑
- windows自带命令开启wifi
- Android MpAndroidchart使用流程和坑--饼状图
- 香蕉派 banana pi BPI-M2 Ultra 四核开源单板计算机,全志R40/allwinner V40芯片方案
- 阅读赵炯的《Linux内核完全注释》之前必须知道的!
- This view is not constrained vertically: at runtime it will jump to the left unless you add a vertic