字节对齐
字节对齐要区分四个概念
1、 基本数据类型的自身对齐值:
1字节:char型
2字节:short型
4字节:int,float类型
8字节:doublel类型
2、程序的指定对齐值:即#pragma pack(value)时的指定对齐值value
3、自定义类型的自身对齐值:结构体或类的成员中自身对齐值最大的值
4、自定义类型的有效对齐值:自定义类型的自身对齐值和指定对齐值中较小的值
例1
struct bb { int a; char b;
double c;
}
程序没有指定对齐值,bb类型自身对齐值为8,则这个结构体的对齐值为8,所以最终结构体的大小应为8的倍数。
在b处补足3,则结构体大小为16,满足自身对齐。
我们可以看到元素b和元素c的确相差4字节,说明确实在b后补足了3字节。
例2
struct bb
{
double c;
int a;
char b[5];
};
和例1相同,程序没有设定自身对齐值,结构体自身对齐值为8,因此在b后补足7字节。因此整个结构体的大小为24
例3 将例2稍微修改一下
struct bb
{
double c;
char b[5];
int a;
};
会发现只是将元素位置对调了,但是补齐位置却不一样了,这里在b后补了3字节在a后补了4字节。
例4
struct bb
{
double c;
char b[5];
struct
{
char q;
int w;
bool e;
};
int a;
};
这种类型先确定内部大小,发现内部对其值为4,则大小为12,外部只需要给b后补充3字节,得到结构体大小为32。
对于例4有一种特殊情况
当结构体内部结构体被命名则不计算其大小。
枚举类型和联合体
枚举类型的大小固定为4,联合体类型的大小为其中最大元素的大小,若最大元素大小不是4的倍数,则增大为4的倍数
不积小流无以成江河