This question already has answers here:
What is the meaning of “__attribute__((packed, aligned(4))) ”

(3个答案)


6年前关闭。





下面的代码;

struct s1 {
    void *a;
    char b[2];
    int c;
};

struct s2 {
    void *a;
    char b[2];
    int c;
}__attribute__((packed));


如果s1的大小为12个字节,而s2的大小为10个字节,这是由于以4个字节的块读取数据并且}__attribute__((packed));void*a;的大小减小到仅2个字节吗?

关于}__attribute__((packed));的功能有些困惑。

非常感谢

最佳答案

这是由于alignment所致,在该过程中,编译器在字段之间添加了隐藏的“垃圾”以确保它们具有最佳的(出于性能目的)起始地址。

使用packed会强制编译器不执行此操作,这通常意味着如果硬件在执行某些操作时遇到问题,则访问该结构的速度会变慢(或者根本不可能,从而导致例如总线错误)。对不是4的倍数的地址进行32位访问。

10-07 13:30