文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
改变结构体成员的字节对齐
例子
#include <stdio.h>
typedef struct
{
char a;
int b;
} ST_A;
int main(void)
{
printf("sizeof(ST_A)=%ld\n",sizeof(ST_A));
}
技巧
在上面的程序里, ST_A
结构体的内存布局默认是这样的:
Offset | 1byte | 1byte | 1byte | 1byte |
0 | a | 填充字节 | 填充字节 | 填充字节 |
4 | b | b | b | b |
编译执行,结果如下:
root@ubuntu:~$ gcc -g -o a a.c
root@ubuntu:~$ ./a
sizeof(ST_A)=8
使用 gcc 的" -fpack-struct[=n]
"选项(“ n
”需要为 2
的倍数)可以改变成员的地址对齐。例如指定“ n=2
”时,将标明结构体成员的最大对齐地址为 2。这样 ST_A
结构体中的成员 b
的地址将不再按照 4
字节对齐,内存布局变为:
Offset | 1byte | 1byte | 1byte | 1byte |
0 | a | 填充字节 | b | b |
4 | b | b |
编译执行,结果如下:
root@ubuntu:~$ gcc -g -fpack-struct=2 -o a a.c
root@ubuntu:~$ ./a
sizeof(ST_A)=6
当不指定“ n
”时,将没有填充字节,所有成员将一个挨着一个排在一起:
Offset | 1byte | 1byte | 1byte | 1byte |
0 | a | b | b | b |
4 | b |
编译执行,结果如下:
root@ubuntu:~$ gcc -g -fpack-struct -o a a.c
root@ubuntu:~$ ./a
sizeof(ST_A)=5
由于这个编译选项会导致 ABI(Application Binary Interface) 的改变,所以使用时一定要谨慎。 详情参见 gcc 手册
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论