字节对齐

字节对齐要区分四个概念

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的倍数

posted @ 2020-01-14 10:21  C_hp  阅读(392)  评论(0编辑  收藏  举报