繁体   English   中英

__attribute __(packed)v / s GCC __attribute __((aligned(x))

[英]__attribute__(packed) v/s GCC __attribute__((aligned(x))

以下GCC __attribute__(packed )将打包到字节边界,对齐用于以下目的: -

u8 rx_buf[14] __attribute__((aligned(8)));  
struct S { short f[3]; } __attribute__ ((aligned (8)));

上面的数组将是16字节,我是对的。

意味着sizeof(rx_buff)将是16字节..即结束时2字节对齐

你的问题的答案是否定的。 aligned属性不会更改它所应用的变量的大小,但结构成员的情况略有不同。 引用手册

对齐(对齐)

此属性指定变量或结构字段的最小对齐方式,以字节为单位。 例如,声明:

 int x __attribute__ ((aligned (16))) = 0; 

使编译器在16字节边界上分配全局变量x。

和,

打包

packed属性指定变量或结构字段应具有最小可能的对齐 - 变量的一个字节和字段的一个位,除非您使用aligned属性指定更大的值。

这是一个字段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具有没有对齐限制和叔包装:

+-+--+
|a|bb|
+-+--+

上面的数组将是16字节,我是对的。

不正确。 该数组仍然是14个字节长; __attribute__((aligned))所做的就是在数组外部提供任何必要的填充以使其与8字节边界对齐。 无法安全地假设这个填充存在的位置,或者有多少填充。

因此, sizeof(rx_buf)将保持为14,就像没有对齐时一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM