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

Kat*_*och 12 c gcc

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

u8 rx_buf[14] __attribute__((aligned(8)));  
struct S { short f[3]; } __attribute__ ((aligned (8)));
Run Code Online (Sandbox Code Playgroud)

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

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

Mic*_*kis 24

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

对齐(对齐)

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

int x __attribute__ ((aligned (16))) = 0;
Run Code Online (Sandbox Code Playgroud)

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

和,

打包

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

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

struct foo
{
    char a;
    int x[2] __attribute__ ((packed));
};
Run Code Online (Sandbox Code Playgroud)

请注意,该aligned属性可以通过在成员之间插入填充来更改结构的内存布局.随后,结构的大小将改变.例如:

struct t {
    uint8_t  a __attribute__((aligned(16))); /* one byte plus 15 as padding here */
    uint16_t b __attribute__((aligned(16)));
};
Run Code Online (Sandbox Code Playgroud)

将导致15个字节的填充,a而目标体系结构的默认对齐可能导致更少.如果packed为结构指定了属性丢失了aligned属性,则结构的大小为3个字节.下面是一个结构的内存布局在每种情况下可能看起来如何的说明.

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

+-+-------+--+-------+
|a|       |bb|       |
+-+-------+--+-------+
Run Code Online (Sandbox Code Playgroud)

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

+-+---------------+--+---------------+
|a|    padding    |bb|    padding    |
+-+---------------+--+---------------+
Run Code Online (Sandbox Code Playgroud)

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

+-+--+
|a|bb|
+-+--+
Run Code Online (Sandbox Code Playgroud)

  • 你错过了一种对齐的效果 - 如果`a`和`b`对齐,那么在'b`之后也会有填充.这是因为`struct t`的大小必须是16的倍数(否则,在数组中,第二个元素的字段将不对齐). (6认同)