如果我的整个结构中有一个已打包的字段,为什么整个结构都是打包的?
范例:
#include <stdio.h>
struct foo {
int a;
} __attribute__((packed));
struct bar {
char b;
struct foo bla;
char a;
};
int main() {
printf("%ld\n", sizeof(struct bar));
return 0;
}
https://ideone.com/bjoZHBbar
结构体的Sizeof是6,但它应该是12,因为它应该对齐。
1条答案
按热度按时间n3ipq98p1#
这似乎是因为
__attribute__((packed))
意味着使用最小内存的结构,它也意味着它可以忽略对齐的侧线成员时,它是在另一个结构。检查以下结构:当你检查这个结构的大小时,它将是6。这是因为它忽略了2个边成员(此处为
a
和b
)的成员对齐。但这个结构:大小为12,因为它在4字节边界上对齐
c
。在你的例子中,如果你同时使用aligned
属性,它会像你期望的那样工作:该结构尺寸为12。
更新:
我只在
GCC
的attributes的 aligned 部分找到了这个。我认为这与我在这里提到的有关:aligned属性只能增加对齐度;但是你也可以通过指定packed来减少它
只要记住,如果你想保持子结构打包,但主结构对齐,你需要在2个不同的声明中使用2个属性。例如,以下结构的大小为12:
但是如果你在
foo
的声明中使用aligned()
作为__attribute__((aligned (4), packed))
,大小将是16。发生这种情况是因为foo
也会对齐,并且在打包的情况下它不会有用。