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个字节的空间,

这里写图片描述
在这里可以看到,当有虚函数的存在时候会占用四个字节的空间,原因是因为如果有虚函数存在在构造对象的时候会多构造一个虚指针。