This question already has answers here:
What is the meaning of “__attribute__((packed, aligned(4))) ”
(3个答案)
6年前关闭。
下面的代码;
如果
关于
非常感谢
(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