16

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

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

上面的数组将是 16 字节,对吗?

意味着sizeof(rx_buff)将是 16 字节 .. 即在末尾对齐 2 字节

4

2 回答 2

32

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

对齐(对齐)

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

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

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

和,

包装好的

打包属性指定变量或结构字段应该具有最小可能的对齐方式——变量一个字节,字段一个位,除非您使用对齐属性指定更大的值。

这是一个将字段 x 打包的结构,因此它紧跟在 a 之后:

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)));
};

之后会导致 15 个字节的填充,a而目标架构的默认对齐可能会导致更少。如果您指定了packed结构的属性丢失了aligned属性,则结构的大小将为 3 个字节。这是一个结构的内存布局在每种情况下的样子的说明。

struct t在 8 字节边界上没有属性和默认对齐方式:

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

struct t当 a 和 b 在 16 字节边界上对齐时:

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

struct t当 a 和 b 没有对齐限制并且 t 被打包时:

+-+--+
|a|bb|
+-+--+
于 2013-01-15T07:44:44.497 回答
4

上面的数组将是 16 字节,对吗?

不正确。数组仍然是 14 字节长;所做的只是在数组外部__attribute__((aligned))提供任何必要的填充以将其对齐到 8 字节边界。不可能安全地假设此填充存在于何处,或存在多少。

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

于 2013-01-15T07:28:26.610 回答