gpt4 book ai didi

c - gcc 结构中的内存对齐

转载 作者:行者123 更新时间:2023-11-30 16:59:06 25 4
gpt4 key购买 nike

我正在将一个应用程序移植到 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 字节边界对齐,并且内部数据现在与四字节边界对齐,但由于字节顺序,结构的大小大小从 42 字节增加到 44 字节。这个大小至关重要,因为我们有其他应用程序依赖于 42 字节的结构。

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

最佳答案

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com