结构体对齐是指在内存中存储结构体成员时,为了优化数据访问效率,编译器会根据成员的类型和大小对成员进行排列,使得成员在内存中的地址满足一定的对齐要求。例如,一个4字节的整数类型成员通常会被对齐到4字节的边界上,以确保在读取或写入该成员时不需要额外的内存访问操作。
首先来说一下结构体的对齐规则。 一、结构体对齐规则首先要看有没有用#pragma pack宏声明,这个宏可以改变对齐规则,有宏定义的情况下结构体的自身宽度就是宏上规定的数值大小,所有内存都按照这个宽度去布局(这样说其实不太严谨,后面会提到),#pragma pack 参数只能是 '1', '2', '4', '8', or '16'。 二...
现在我们计算一下struct st3结构体占用空间大小,从a5偏移出计算16 + 1 = 17。在struct st3中最大成员变量占用8个字节,所以结构体总大小应该是8的倍数,最后结构体总大小是17 + 7 = 24,这里的7个字节在最后补齐。 我们依旧写一个小程序输出struct st3类型变量各个成员变量地址和结构体总大小。 intmain(){...
在c语言中,结构体的内存对齐方式默认为按4字节对齐,这意味着结构体中的每个成员都会按照4字节的倍数分配内存空间。但是,有时候按4字节对齐会造成浪费,因为有些数据类型只需要1字节或2字节的内存空间就可以表示。 所以,我们可以使用#pragma pack来修改结构体的内存对齐方式。例如,如果我们想要按1字节对齐,只需要在结构...
【一听就懂】结构体的基本使用!学校里一般不会教的C语言结构体,到底有哪些基本用法呢? 35:38 【一听就懂】结构体的嵌套与取别名!C语言结构体嵌套的几种形式,你都掌握好了吗? 08:24 【一听就懂】C语言结构体的字节对齐!从零开始,20分钟带你搞懂结构体的字节对齐及指定对齐方式! 26:36 【一听就懂】C...
1.什么是字节对齐 在c语言的结构体里面一般会按照某种规则去进行字节对齐。 我们先看一段代码: 代码语言:javascript 复制 struct st1{char name;double age;char sex;};//32位下 sizeof(struct st1) = 16//64位下 sizeof(struct st1) = 24struct st2{char a;char b;char c;};//32位和64位下, siz...
1字节对齐,但i为int类型,按4字节对齐,所以不能紧跟其后,i的地址要为4的整数倍,所以在c1后空出了3字节开始存放,c2为1字节对齐,紧跟在i后面即可,这样算的话,总字节数为9,但结构体的总大小要为最大对齐数的整数倍,这个结构体的最大对齐数就是4,所以得在c2的后面再补3个字节,所以这个结构体就占用了12字节...
3). 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;会在最末一个成员之后加上填充字节{trailing padding}。 3. 对齐方法: (1). 使用pragma宏指令来指定对齐的字节个数。 #pragma pack(N) /*人为指定,指定值N必须为2的幂次方(1,2,4,8...) */ #pragma...
1字节对齐,但i为int类型,按4字节对齐,所以不能紧跟其后,i的地址要为4的整数倍,所以在c1后空出了3字节开始存放,c2为1字节对齐,紧跟在i后面即可,这样算的话,总字节数为9,但结构体的总大小要为最大对齐数的整数倍,这个结构体的最大对齐数就是4,所以得在c2的后面再补3个字节,所以这个结构体就占用了12字节...