我正在使用ARM。由于奇数偏移的读/写,我得到了对齐故障(我们知道ARM是4字节对齐的)。我程序中定义的所有结构都是单字节对齐的,如
#pragma pack(push, 1)
typedef struct
{
char a1;
int a2;
char a3;
}a;
#pragma pack(pop)
我正在尝试
#pragma pack(push, 1)
typedef struct
{
char a1 __attribute__ ((aligned (4)));
int a2;
char a3;
}a;
#pragma pack(pop)
gcc属性 _ 属性 _((aligned(4)))无效。
Note :: The above code is not my actual code. sample scenario.
所以我重新安排了结构成员来解决对齐问题。我想确保重新安排是否是可能的解决方案,或者我们可以使 _ 属性 _ 来处理此方案。欢迎任何其他解决方案。提前致谢。
答案 0 :(得分:1)
您可以安全地在ARM上的字节对齐结构中读取/写入char / int,编译器会注意对齐。对齐问题可能出现单个问题,如下所示:转换为32位int:
char buf[5];
char *p = buf + 1;
*((int *)p) = 1;
注意:如果由于某些原因(例如对齐某个成员(从结构的开头),您可以使用以下技巧:
typedef struct {
struct {} __attribute__ ((aligned (4)));
char a1; // offset is 4
int a2; // offset is 5
char a3; // offset is 9
} a;