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