返回介绍

改变结构体成员的字节对齐

发布于 2025-02-22 23:07:56 字数 1908 浏览 0 评论 0 收藏 0

例子

#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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文