C 如何将结构明确地对齐为4字节
下面的代码片段,我们如何使下面的结构定义为4字节对齐 我已经尝试了C 如何将结构明确地对齐为4字节,c,struct,C,Struct,下面的代码片段,我们如何使下面的结构定义为4字节对齐 我已经尝试了pragma pack来显式对齐。但是它并没有按照我们想要的那样工作 #pragma pack(push) #pragma pack(4) //..struct devine here. #pragma pack(pop); 我已经尝试了显式对齐\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu struct device_inf
pragma pack
来显式对齐。但是它并没有按照我们想要的那样工作
#pragma pack(push)
#pragma pack(4)
//..struct devine here.
#pragma pack(pop);
我已经尝试了显式对齐\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
struct device_info {
//
}__attribute__(packed);
//struct device_info dev_info;
sizeof (struct device_info)=211
struct device_info {
//
};
typedef struct device_info deice_info __attribute__(packed)
device_info dev_info;
sizeof (dev_info)=211
我已经尝试了显式对齐\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
struct device_info {
//
}__attribute__(packed);
//struct device_info dev_info;
sizeof (struct device_info)=211
struct device_info {
//
};
typedef struct device_info deice_info __attribute__(packed)
device_info dev_info;
sizeof (dev_info)=211
问题1:
如何明确对齐struct device\u 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;
//...
};
及
问题3
我们如何在源代码编译期间转储以执行二进制或库?(预处理->编译->链接)objdump?或其他?因为C11可以使用标准。
这将解决您的问题。因为C11您可以使用标准。
这将解决您的问题。在您的实现中,sizeof(bool)
似乎等于1。在这种情况下,填充规则被正确遵守,因此未锁定
可以在magic
之后精确显示,而无需额外填充
另一件事是bool
是实现定义的。请阅读此帖:
您可能会从中受益更多的是,当您以绝对尺寸布置结构时,使用
中的适当类型。如果希望布尔值为32位整数,则使用int32\u t
或uint32\u t
。在实现中,sizeof(bool)
似乎等于1。在这种情况下,填充规则被正确遵守,因此未锁定
可以在magic
之后精确显示,而无需额外填充
另一件事是bool
是实现定义的。请阅读此帖:
您可能会从中受益更多的是,当您以绝对尺寸布置结构时,使用
中的适当类型。如果希望布尔值为32位整数,请使用int32\u t
或uint32\u t
。C++和C是两种不同的语言,根据您实际使用的语言,问题的答案会有所不同。请选择一种,然后从你的问题标签中删除另一种语言。#pragma pack(40)
对我来说似乎有点不合适。至于属性,您试图将其应用于typedef
,我认为这是不允许的。@MatteoItalia,很抱歉出错。#pragma pack(4)
看起来,如果您使用4字节类型而不是bool
,所有内容都将正确对齐,而无需任何技巧。@Austings两个数组元素的地址之间的字节差异是数组元素类型的大小C++和C是两种不同的语言,你的问题的答案会因你所说的语言而异。请选择一种,然后从你的问题标签中删除另一种语言。#pragma pack(40)
对我来说似乎有点不合适。至于属性,您试图将其应用于typedef
,我认为这是不允许的。@MatteoItalia,很抱歉出错。#pragma pack(4)
看起来,如果使用4字节类型而不是bool
,则所有内容都将正确对齐,而无需任何技巧。@Austings两个数组元素的地址之间的字节差异,是数组元素类型的大小谢谢。对齐的4字节仅适用于此struct@caopengstruct alignas(4)foo{…}代码>是否被gcc
遵从的参数禁用?谢谢。对齐的4字节仅适用于此struct@caopengstruct alignas(4)foo{…}代码>它是否被gcc
兼容参数禁用