是否可以在单字节对齐结构中对齐特定结构成员?

时间:2012-07-19 10:01:07

标签: c linux alignment arm structure

我正在使用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. 


所以我重新安排了结构成员来解决对齐问题。我想确保重新安排是否是可能的解决方案,或者我们可以使 _ 属性 _ 来处理此方案。欢迎任何其他解决方案。提前致谢。

1 个答案:

答案 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;