簡體   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