__attribute__ 由一个整数组成
__attribute__ packed of an integer
在 gcc documentation 中,他们提供了有关整数如何 对齐 的信息。 packing 整数可以做同样的事情吗?
例如,这在不会自动处理不正确对齐数据的系统上有效吗?
typedef uint16_t __attribute__ ((packed)) packed_uint16_t;
在我的系统上它给出:
align.c:7:1: warning: ‘packed’ attribute ignored [-Wattributes]
typedef uint16_t attribute ((packed)) packed_uint16_t;
但是我的系统正确地处理了未对齐的字节,所以我猜它会忽略它!
这是 this question
的跟进
__attribute__((packed))
仅适用于结构。它指定在结构成员之间或之后不应有填充。编译器仍然假定结构本身已正确对齐,但它可能会生成特殊代码来访问未对齐的结构成员。
如果您有一个未对齐的指针(我不确定您是如何得到这样一个指针的)并且您想要以可移植的方式取消引用它,请考虑这样做:
some_type *mptr; /* misaligned pointer */
char *buffer = malloc(sizeof *mptr); /* get some aligned memory */
memcpy(buffer, mptr, sizeof *mptr);
some_type *aptr = (some_type*)mptr; /* pointer to aligned data */
在 gcc documentation 中,他们提供了有关整数如何 对齐 的信息。 packing 整数可以做同样的事情吗?
例如,这在不会自动处理不正确对齐数据的系统上有效吗?
typedef uint16_t __attribute__ ((packed)) packed_uint16_t;
在我的系统上它给出:
align.c:7:1: warning: ‘packed’ attribute ignored [-Wattributes]
typedef uint16_t attribute ((packed)) packed_uint16_t;
但是我的系统正确地处理了未对齐的字节,所以我猜它会忽略它!
这是 this question
的跟进__attribute__((packed))
仅适用于结构。它指定在结构成员之间或之后不应有填充。编译器仍然假定结构本身已正确对齐,但它可能会生成特殊代码来访问未对齐的结构成员。
如果您有一个未对齐的指针(我不确定您是如何得到这样一个指针的)并且您想要以可移植的方式取消引用它,请考虑这样做:
some_type *mptr; /* misaligned pointer */
char *buffer = malloc(sizeof *mptr); /* get some aligned memory */
memcpy(buffer, mptr, sizeof *mptr);
some_type *aptr = (some_type*)mptr; /* pointer to aligned data */