#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
//在设计结构体的时候,尽量让空间小的成员集中在一起

//计算结构体的大小:
//1、第一个成员存储在偏移量为0的地址处
//2、其它成员变量要对齐到 对齐数 的整数倍的地址处
//对齐数==编译器默认的一个对齐数与该成员大小的较小值 (vs默认对齐数为8)
//3、结构体总大小为 最大对齐数的整数倍
//4、如果嵌套了结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构
//体的整体大小就是所有最大对齐数的整数倍

struct S1
{
char c1;
int a;
char c2;
};
struct S2
{
char c1;
char c2;
int a;
};
struct S3
{
double d;
char c;
int i;
};
struct S4
{
char c;
struct S3 s3;
double d;
};
int main()
{
struct S1 s1 = { 0 };
printf("%d ", sizeof(s1)); //12

struct S2 s2 = { 0 };
printf("%d ", sizeof(s2)); //8

struct S3 s3 = { 0 };
printf("%d ", sizeof(s3)); //16

struct S4 s4 = { 0 };
printf("%d ", sizeof(s4)); //1+7(浪费的空间)+16+8=32
return 0;
}


//修改默认对齐数:
//设置默认对齐数为:1

//#pragma pack(1)
//struct S
//{
// char c1;
// double d;
//};
//#pragma pack() //取消设置的默认对齐数
//int main()
//{
// struct S s;
// //printf("%d\n", sizeof(s)); //默认对齐数为8时: 16
// //printf("%d\n", sizeof(s)); //默认对齐数为4时:12
// printf("%d\n", sizeof(s)); //默认对齐数为1时:9
// return 0;
//}


//offsetof(): 求成员在结构体中的偏移量
//offsetof()是宏,不是函数
#include<stddef.h>
//struct S
//{
// char c;
// int i;
// double d;
//};
//int main()
//{
// printf("%d ", offsetof(struct S, c)); //0:该成员地址相对于首个成员地址的偏移量
// printf("%d ", offsetof(struct S, i)); //4:该成员地址相对于首个成员地址的偏移量
// printf("%d ", offsetof(struct S, d)); //8:该成员地址相对于首个成员地址的偏移量
// return 0;
//}