gpt4 book ai didi

c - __attribute__(packed) 与 GCC __attribute__((aligned(x))

转载 作者:太空狗 更新时间:2023-10-29 16:39:49 27 4
gpt4 key购买 nike

遵循 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 属性不会改变它所应用的变量的大小,但结构成员的情况略有不同。引用manual ,

aligned (alignment)

This attribute specifies a minimum alignment for the variable or structure field, measured in bytes. For example, the declaration:

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

causes the compiler to allocate the global variable x on a 16-byte boundary.

和,

packed

The packed attribute specifies that a variable or structure field should have the smallest possible alignment — one byte for a variable, and one bit for a field, unless you specify a larger value with the aligned attribute.

Here is a structure in which the field x is packed, so that it immediately follows 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)));
};

会导致在 a 之后填充 15 个字节,而目标体系结构的默认对齐方式可能会导致更少。如果您为结构指定了 packed 属性,并且 丢失了 aligned 属性,则该结构的大小将为 3 个字节。下面是结构的内存布局在每种情况下可能的示例。

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

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

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

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

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

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

关于c - __attribute__(packed) 与 GCC __attribute__((aligned(x)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14332633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com