struct字节对齐问题

struct字节对齐问题

代码验证

#include <iostream>
#include <stdio.h>
using namespace std;
/*

https://www.cnblogs.com/ningvsban/p/3940153.html
https://blog.csdn.net/m0_37829435/article/details/81348532

总结:
内存对齐原则
1、  对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数\
据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数。
2、  在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对\
齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。

*/
#pragma pack(8)
struct A {
	short b;//2+补齐2,保证int c起始地址的偏移量是min(pack(8),int(4))=4的倍数
	int c;//4
	char a;//
};
#pragma pack()

#pragma pack(2)
struct B {
	short b;//2
	int c;//4
	char a;//1+补齐1
};
#pragma pack()

struct C {
	char arr[7];//7+补1
	short b;//2+补2
	int c;//4
	char a;//1+补齐3
};

typedef struct _parent
{
	short c;//2
	char b;//1+补1
	int a;//4
	
}parent;

struct _child
{
	char d;//1+补3,补齐3是为了保证嵌套类p的偏移起始地址(0)\
		   是嵌套类中最大成员(int)或者实际对齐单位(还是取两者小的那个)的整数倍,\
		   切记,并不是子类起始变量类型short的整数倍
	parent p;//8
	int e;//4
};


typedef struct _parent1
{
	short c;//2
	char b;//1+补5
	double a;//8

}parent1;

struct _child1
{
	int d;//4+补4,补齐4是为了保证嵌套类p的偏移起始地址(0)\
		   是嵌套类中最大成员(double)或者实际对齐单位(还是取两者小的那个)的整数倍
	parent1 p;//16
	char e;//1+补多少?是补3保证当前_child1中的int对齐?还是补7保证与子类中double对齐?,答案是补7
};
int main()
{
	printf("size of struct A = %d \n", sizeof(struct A));//
	//size of struct A = 12,结构体本身按照min(pack(8),int(4))中的最小的int(4)对齐

	printf("size of struct B = %d \n", sizeof(struct B));//
	//size of struct B = 8,结构体本身按照min(pack(2),int(4))中的最小的pack(2)对齐

	printf("size of struct C = %d \n", sizeof(struct C));//
	//size of struct C = 20,结构体按照最大的成员类型int(4)补齐,不是sizeof(arr)大小7

	printf("size of struct _parent = %d \n", sizeof(_parent));//
	//size of struct _parent = 8

	printf("size of struct _child = %d \n", sizeof(struct _child));//

	printf("size of struct _parent1 = %d \n", sizeof(_parent1));//
	//size of struct _parent = 16

	printf("size of struct _child1 = %d \n", sizeof(struct _child1));//

	system("pause");
	return 0;
}

输出结果

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章