结构体占用空间大小是所有的变量占用空间大小的之和,非也,如果结构体不是一个变量,则考虑字节对齐,如果是一个变量,不涉及到字节对齐
结构体字节对齐规则:
先介绍三个概念:自身对齐值、指定对齐值、有效对齐值。
自身对齐值:数据类型本身的对齐值,例如char类型的自身对齐值是1,short类型是2;
指定对齐值:编译器或程序员指定的对齐值,32位单片机的指定对齐值默认是4;
有效对齐值:自身对齐值和指定对齐值中较小的那个。
对齐两个规则:
1、不但结构体的成员有有效对齐值,结构体本身也有对齐值,这主要是考虑结构体的数组。结构体的有效对齐值是其最大数据成员的自身对齐值,也就是结构体大小是自身对齐值的整数倍;
2、存放成员的起始地址必须是该成员有效对齐值的整数倍。
考虑字节对齐分系统
32系统,最大对齐值是4字节,默认情况下是按照32位4字节对齐的,如下分析:每行4个字节,字符数据按照一个一个的存储;short型数据按照2个字节2个字节的存储;int和folat,以及long,double按照4个字节4个字节存储
64位系统是根据最大变量的长度确定对齐的,如果最长数据为8字节,则8字节对齐,如果最长数据为4字节,则4字节对齐.如下分析:每行8个字节,字符数据按照一个一个的存储;short型数据按照2个字节2个字节的存储;int和float,按照4个字节4个字节的存储,long和double型按照8个字节8个字节的存储
如果是64位,最大对齐位数是结构体中最长的数据类型,不受64位系统长度的限制,比如可以按照long double 16位对齐
64位系统
例子1:
#include <stdio.h>
struct Demo
{
char a;
int b;
char d;
double c;
};
int main()
{
printf("%d",sizeof(Demo));
return 0;
}
结果:
24
例子2:
#include <stdio.h>
#pragma pack (4)
struct Demo
{
char a;
int b;
char d;
double c;
};
#pragma pack ()
int main()
{
printf("%d",sizeof(Demo));
return 0;
}
结果:
20
参考:
https://blog.csdn.net/Eunice_fan1207/article/details/79696981
https://blog.csdn.net/lyq0527/article/details/52953932
https://www.cnblogs.com/heart-flying/p/9556401.html