在C语言中,结构体(struct)是一种用户自定义的数据类型,用于将不同类型的数据组合在一起。结构体中的字节对齐规则通常遵循以下原则: 成员对齐:结构体中的每个成员都按照其类型的自然对齐方式(即该类型在内存中占用的字节数的整数倍)进行对齐。 结构体对齐:结构体本身的对齐方式通常等于其最宽成员的对齐方式,或者由...
一、结构体对齐规则首先要看有没有用#pragma pack宏声明,这个宏可以改变对齐规则,有宏定义的情况下结构体的自身宽度就是宏上规定的数值大小,所有内存都按照这个宽度去布局(这样说其实不太严谨,后面会提到),#pragma pack 参数只能是 '1', '2', '4', '8', or '16'。 二、在没有#pragma pack这个宏的声明...
a.v3因为默认对齐数是8,基本类型char的长度是1,取较小值1,按1字节对齐,因此,在a.v2结束之后开始即可,所以选择offset=16开始,占一个字节。【规则一】 接着,结构体A_t的最大成员变量长度是8,默认对齐数也是8,整体按照8字节对齐,所以最终大小大于17且是8的整数倍,所以sizeof(A_t)=24。【规则二】 结构体B...
从以上结果可以看出,结构体st1在32位下是按照4个字节来对齐的,在64位下则是按照8个字节来对齐的,结构体st2则不管32位还是64位则都是按照1个字节对齐的。 那么我们可以总结出对齐规则如下: 在所有结构体成员的字节长度都没有超出操作系统基本字节单位(32位操作系统是4,64位操作系统是8)的情况下,按照结构体中字...
【规则二】整体对齐规则:跟最大数据成员长度的整数倍对齐 在数据成员完成各自对齐之后,结构体(或联合体)本身也要进行对齐。 所有结构体成员的字节长度 没有超出(<=) 操作系统的基本字节单位(32位操作系统为4,64位操作系统为8),按照结构体中字节数最大的变量长度来对齐 ...
2.1,结构体对齐规则 结构体中寻找所有成员中占字节数最大成员,其余成员根据占字节数最大成员拼凑或者插入空位构成n个(n>=1)最大成员字节。 2.2,实例 上图例子实测: int main() { struct stu{ char a; int b; short c; char d; }; struct stu s; printf("the sizeof s is %d\n", sizeof s);...
C语言中字节对齐的作用不仅是便于CPU的访问,提高程序的执行效率,同时合理的利用字节对齐可以有效地节省存储空间,减少内存的消耗; 2. 字节对齐原则: 结构体字节对齐的细节和具体编译器实现相关,但一般而言满足三个准则: 1).结构体变量的首地址能够被其最宽基本类型成员的大小所整除; ...
1字节对齐,但i为int类型,按4字节对齐,所以不能紧跟其后,i的地址要为4的整数倍,所以在c1后空出了3字节开始存放,c2为1字节对齐,紧跟在i后面即可,这样算的话,总字节数为9,但结构体的总大小要为最大对齐数的整数倍,这个结构体的最大对齐数就是4,所以得在c2的后面再补3个字节,所以这个结构体就占用了12字节...
C语言数据结构字节对齐 /* 规则一:结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。 规则二:如果一个结构体B里嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数...