【问题标题】:Is it possible to align a particular structure member in single-byte aligned structure?是否可以在单字节对齐结构中对齐特定结构成员?
【发布时间】:2012-07-18 11:48:20
【问题描述】:

我正在使用 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 属性 _attribute_ ((aligned (4))) 无效。

Note :: The above code is not my actual code. sample scenario. 


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

【问题讨论】:

  • 似乎#pragma 覆盖了_ 属性 。是否可以删除#pragma?并在必要时使用_ _attribute _ ((packed))?
  • 我无法删除#pragma。我正在读取这样的 USB 数据。这些结构应该是单字节打包的。
  • 好的,那么您可以只为这些 USB 结构设置 ((packed)) 属性,并删除 pragma。
  • 结构的第一个成员从偏移量 0 开始,因此它必须与结构本身具有相同的对齐方式。
  • 所以我不能在#pragma 中使用属性???

标签: c linux alignment arm structure


【解决方案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;

【讨论】:

  • 如果该结构是使用#pragma 单字节对齐的,是否可以将结构成员对齐到 4 字节???
  • 你可以:尝试这样做:int __attribute__((aligned (4))) a2;
  • 试过了。结构大小没有变化。只给出 6 个。
  • 注意:我要对齐 a1(char),而不是 a2。
  • 我喜欢这类问题。
猜你喜欢
  • 1970-01-01
  • 2011-09-08
  • 2011-10-14
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多