例如,这是否在一个没有自动处理不正确对齐的数据的系统上有效?
typedef uint16_t __attribute__ ((packed)) packed_uint16_t;
在我的系统上,它给出了:
align.c:7:1:警告:'packed'属性被忽略[-Wattributes]
typedef uint16_t 属性((已包装))packed_uint16_t;
但我的系统正确处理未对齐的字节,所以我想它会忽略它!
的后续行动答案 0 :(得分:2)
__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 */