以下GCC __attribute__(packed )
将打包到字节边界,对齐用于以下目的: -
u8 rx_buf[14] __attribute__((aligned(8)));
struct S { short f[3]; } __attribute__ ((aligned (8)));
上面的数组将是16字节,我是对的。
意味着sizeof(rx_buff)
将是16字节..即结束时2字节对齐
答案 0 :(得分:21)
你的问题的答案是否定的。 aligned
属性不会更改其应用的变量大小,但结构成员的情况略有不同。引用manual,
对齐(对齐)
此属性指定变量或结构字段的最小对齐方式,以字节为单位。例如,声明:
int x __attribute__ ((aligned (16))) = 0;
使编译器在16字节边界上分配全局变量x。
和
包装
packed属性指定变量或结构字段应具有尽可能小的对齐 - 变量的一个字节, 和一个字段的字段,除非你指定一个更大的值 对齐属性。
这是一个字段x被打包的结构,因此它紧跟在:
之后struct foo { char a; int x[2] __attribute__ ((packed)); };
请注意,aligned
属性可以通过在成员之间插入填充来更改结构的内存布局。随后,结构的大小将改变。例如:
struct t {
uint8_t a __attribute__((aligned(16))); /* one byte plus 15 as padding here */
uint16_t b __attribute__((aligned(16)));
};
将在a
之后导致15个字节的填充,而目标体系结构的默认对齐可能导致更少。如果您为结构指定packed
属性并且丢失了aligned
属性,则结构的大小将为3个字节。
以下是在每种情况下结构的内存布局可能的示例。
struct t
在8字节边界上没有属性和默认对齐:
+-+-------+--+-------+
|a| |bb| |
+-+-------+--+-------+
当a和b在16字节边界上对齐时, struct t
:
+-+---------------+--+---------------+
|a| padding |bb| padding |
+-+---------------+--+---------------+
struct t
当a和b没有对齐限制且t被打包时:
+-+--+
|a|bb|
+-+--+
答案 1 :(得分:4)
上面的数组将是16字节,我是对的。
不正确的。该数组仍然是14个字节长; __attribute__((aligned))
所做的就是在数组之外提供任何必要的填充,以使其与8字节边界对齐。无法安全地假设这个填充存在的位置,或者有多少填充。
因此,sizeof(rx_buf)
将保持为14,就像没有对齐一样。