c - gcc 结构中的内存对齐

标签 c gcc memory-management arm gcc4

我正在用 C 语言将应用程序移植到 ARM 平台,该应用程序也在 x86 处理器上运行,并且必须向后兼容。

我现在在变量对齐方面遇到了一些问题。我已经阅读了 gcc 手册 __attribute__((aligned(4),packed))我将所说的解释为结构的开头与 4 字节边界对齐,并且由于打包语句,内部保持不变。

最初我有这个,但偶尔它会与 4 字节边界不对齐。

typedef struct  
{  
 unsigned int code;  
 unsigned int length;  
 unsigned int seq;  
 unsigned int request;  
 unsigned char nonce[16];  
 unsigned short  crc;  
} __attribute__((packed)) CHALLENGE;

所以我改成这样。

typedef struct  
{  
 unsigned int code;  
 unsigned int length;  
 unsigned int seq;  
 unsigned int request;  
 unsigned char nonce[16];  
 unsigned short  crc;  
} __attribute__((aligned(4),packed)) CHALLENGE;

我之前所说的理解似乎是不正确的,因为结构现在与 4 字节边界对齐,并且内部数据现在与 4 字节边界对齐,但是由于字节顺序,结构的大小大小从 42 字节增加到 44 字节。这个大小很重要,因为我们有其他应用程序依赖于 42 字节的结构。

有人可以向我描述如何执行我需要的操作吗?非常感谢任何帮助。

最佳答案

如果您依赖于 42 字节的 sizeof(yourstruct),那么您将被不可移植的假设所困扰。您没有说明这是为了什么,但结构内容的字节顺序似乎也很重要,因此您也可能与那里的 x86 不匹配。

在这种情况下,我认为唯一可靠的应对方法是在重要的部分使用 unsigned char[42]。首先编写一个精确的规范,说明在这个 42 字节的 block 中究竟有哪些字段,以及字节序,然后使用该定义编写一些代码以在该定义和您可以与之交互的结构之间进行转换。代码可能是一次性的序列化代码(也称为编码),或者是一堆 getter 和 setter。

关于c - gcc 结构中的内存对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2554229/

相关文章:

c - 简单的程序检查 ip - scanf 段错误

c - 如何在 C 中链接目标文件? "Undefined symbols for architecture x86_64"失败

visual-studio - 输出窗口中的错误 - Managed' 已退出,代码为 -2147023895 (0x800703e9)

c++ - 删除后哪些指针悬空?

c - 后台程序中的 printf()

c - 触发 inotify 文件更改事件

gcc - 有没有办法在 clang 或 gcc 中使用编译指示禁用所有警告?

ios - 不合理的堆增长

c++ - 新接触窗口应用程序的人应该学习 X、GTK+ 还是什么?

c - 在 gcc 内联汇编中加载寄存器? (简单的?)