3

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


所以我重新安排了结构成员来解决对齐问题。我想确保重新安排是否是可能的解决方案,或者我们可以让_属性_在这种情况下工作。欢迎任何其他解决方案。提前致谢。

4

1 回答 1

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;
于 2012-07-19T10:08:45.210 回答