在代码片段下面,我们如何使下面的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_info
,以及offsetof
输出如下:
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?或其他?
答案 0 :(得分:2)
从C11起,您可以使用标准alignas specifier。 这应该可以解决你的问题。
答案 1 :(得分:0)
在您的实施中,sizeof(bool)
似乎等于1.在这种情况下,正确遵守了填充规则,因此is_unlocked
可以在magic
之后准确显示没有额外的填充。
另一件事是bool
是实现定义的。请阅读这篇文章:Is sizeof(bool) defined?
当您布置具有绝对大小的结构时,您可能从中受益更多的是使用来自<ctype.h>
的正确类型。如果您希望bool值为32位整数,请改用int32_t
或uint32_t
。