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

标签 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 属性 _attribute_ ((aligned (4))) 无效。

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


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

最佳答案

您可以在 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;

关于c - 是否可以在单字节对齐结构中对齐特定结构成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11558371/

相关文章:

c - 使用 MPI 发送和接收派生数据类型

在运行时从具有相同函数签名的许多文件中的一个文件调用 C 函数

C 编程输入一个被 10 修改的列表

php - 使用 XAMPP 服务器在 ubuntu 12.04 LTS 上安装 Phalcon

c++ - 如何将 CURLOPT_DNS_CACHE_TIMEOUT 与共享 DNS 缓存一起使用

css - Flex wrap - 没有拉伸(stretch)的堆叠行?

html - 为什么我不能对齐两个按钮

c - 用 ALSA 录音

c++ - boost 计时器在 "for"循环中产生相同的结果?

ruby - 如何在 Ruby 中检测 TCP 客户端断开连接