繁体   English   中英

如何将结构明确对齐为4个字节

[英]How can I aligned struct as 4 bytes expicitly

下面的代码片段,如何使下面的struct定义为4个字节对齐?

我已经尝试过pragma pack明确地对齐。但是它并不能如我们所愿...

#pragma pack(push)
#pragma pack(4)
//..struct devine here.
#pragma pack(pop);

我已经尝试过__attribute__明确地对齐。它也不起作用。

struct device_info {
    //
}__attribute__(packed);
//struct device_info dev_info;
sizeof (struct device_info)=211

我已经尝试过__attribute__明确地对齐。它也不起作用。

struct device_info {
    //
};
typedef struct device_info deice_info __attribute__(packed)
device_info dev_info;
sizeof (dev_info)=211

问题1:

如何显式对齐struct device_infooffsetof输出,如下所示:

    offsetof magic=0
    offsetof is_unlocked=16
    offsetof is_tampered=20
    offsetof is_unlock_critical=24
    offsetof charger_screen_enabled=28
    offsetof display_panel=32
    offsetof booloader_version=96
    offsetof radio_version=160
    offsetof verity_mode=224
    offsetof is_origin=228

代码段:

#define DEVICE_MAGIC_SIZE 13
#define MAX_PANEL_ID_LEN 64
#define MAX_VERSION_LEN 64
struct device_info{
    unsigned char magic[DEVICE_MAGIC_SIZE];
    bool is_unlocked;
    bool is_tampered;
    bool is_unlock_critical;
    bool charger_screen_enabled;
    char display_panel[MAX_PANEL_ID_LEN];
    char booloader_version[MAX_VERSION_LEN];
    char radio_version[MAX_VERSION_LEN;
    bool verity_mode;
    bool is_origin;
};

更新1

我已经尝试了以下片段

struct device_info{
    __attribute__((__aligned(4))) bool is_unlock;
    //...
};

工作正常是一样的。

问题二:

之间有什么区别

struct device_info{
    __attribute__((__aligned(4))) bool is_unlock;
    //...
};

struct device_info{
    bool is_unlock;
    //..
}__attribute__((__aligned(4))) ;

问题3

在编译为执行二进制或库的源代码期间,我们如何转储?(预处理->编译->链接)objdump?或其他?

从C11开始,您可以使用标准alignas说明符 这应该可以解决您的问题。

在您的实现中,似乎sizeof(bool)等于1。在这种情况下,正确遵守了填充规则,因此is_unlocked可以在magic之后精确地出现而无需附加填充。

另一件事是bool是实现定义的。 请阅读这篇文章: 是否定义了sizeof(bool)?

您可能会从中得到的更多好处是,在布置具有绝对大小的结构时,使用<ctype.h>适当类型。 如果希望布尔值是32位整数,请改用int32_tuint32_t

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM