在缺省情况下,c编译器为每一个变量或是数据单元按其自然对界条件分配空间。
在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有插入的空字节),第一个成员的地址和整个结构的地址相同。
c编译器缺省的结构成员自然对界条件为“n字节对齐”,n即该成员数据类型的长度。如int型成员的自然对界条件为4字节对齐,而double类型的结构成员的自然对界条件为8字节对齐。若该成员的起始偏移不位于该成员的“默认自然对界条件”上,则在前一个节面后面添加适当个数的空字节。
c编译器缺省的结构整体的自然对界条件为:该结构所有成员中要求的最大自然对界条件。若结构体各成员长度之和不为“结构整体自然对界条件的整数倍,则在最后一个成员后填充空字节。
struct test{ char x1; // 成员x1为char型(其起始地址必须1字节对界),其偏移地址为0char x2; // 成员x2为char型(其起始地址必须1字节对界,其偏移地址为1float x3; // 成员x3为float型(其起始地址必须4字节对界),编译器在x2和x3之间填充了两个空字节,其偏移地址为4char x4; // 成员x4为char型(其起始地址必须1字节对界),其偏移地址为8}; 因为test结构体中,最大的成员为flaot x3,因些此结构体的自然对界条件为4字节对齐。则结构体长度就为12字节,内存布局为1100 1111 1000。
#include //#pragma pack(2)typedef struct{ int aa1; //4个字节对齐 1111 char bb1;//1个字节对齐 1 short cc1;//2个字节对齐 011 char dd1; //1个字节对齐 1 } testlength1;int length1 = sizeof(testlength1); //4个字节对齐,占用字节1111 1011 1000,length = 12typedef struct{ char bb2;//1个字节对齐 1 int aa2; //4个字节对齐 01111 short cc2;//2个字节对齐 11 char dd2; //1个字节对齐 1 } testlength2;int length2 = sizeof(testlength2); //4个字节对齐,占用字节1011 1111 1000,length = 12typedef struct{ char bb3; //1个字节对齐 1 char dd3; //1个字节对齐 1 int aa3; //4个字节对齐 001111 short cc23//2个字节对齐 11 } testlength3;int length3 = sizeof(testlength3); //4个字节对齐,占用字节1100 1111 1100,length = 12typedef struct{ char bb4; //1个字节对齐 1 char dd4; //1个字节对齐 1 short cc4;//2个字节对齐 11 int aa4; //4个字节对齐 1111 } testlength4;int length4 = sizeof(testlength4); //4个字节对齐,占用字节1111 1111,length = 8int main(void){ printf(length1 = %d.n,length1); printf(length2 = %d.n,length2); printf(length3 = %d.n,length3); printf(length4 = %d.n,length4); return 0;} 对齐规则为:
1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
结合1、2推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
因此,当使用伪指令#pragma pack (2)时,test结构体的大小为8,内存布局为11 11 11 10。
对于电感器和变压器,我们该如何区分它们
不同波长的光在DWDM系统中的传输技术
人工智能将给各个行业带来怎样的改革
本土手机商电信日欲猛攻3G 外资普遍观望TD
Linux驱动是如何挂载的
c语言中的字节对齐
中科昊芯助力快速推进中国RISC-V开源芯片发展
云计算技术的现状,云计算技术所面临的问题
东软睿驰推动中国智能网联汽车产业发展
iPhone XI系列新机采用浴霸式造型
广东省3大锂电池细分市场解析
Redmi K30有望年底亮相,小米系首款双模5G手机
小米14系列首发搭载澎湃OS,10月26日正式发布
AI机器学习是如何改变3D打印领域的
放大器参数说明
IMEC硬蛋微电子创新中心或将成为世界极芯片设计与制造交付平台
等离子电视都适合每个家庭吗?
李彦宏入选全球十大AI领袖,被称为“中国AI行业的启蒙者与设计师”
互连组件升级,拓宽网络架构速度和带宽
反激转换器的工作过程讲解