2014-05-23 61 views
1

N.B:這與Effects of __attribute__((packed)) on nested array of structures?嵌套結構數組的大小是如何決定的?

類似但不完全相同我正在定義一個包含多個嵌套結構的結構類型。 其中一個成員是一堆包裝結構,這讓我對它應該嵌套的順序有些困惑,相對於先有較大成員的規範。

如果該成員是一個長度爲4的8個字節的結構數組,則該成員總數爲32個字節,被視爲用於打包和對齊的單一實體,從而使另一個單個結構成員18字節,實際上更小?

e.g

typedef struct __attribute__((__packed__)) settingsProfile { 
/* For packing and alignment, is this member 32 bytes or 4 'chunks'(?) of 8 bytes?*/ 
    struct __attribute__((__packed__)) load { 
     int32_t slewRate; 
     int32_t current; 
    } load[4]; 

/* 18 bytes, so if the above *isn't* 32 it should be below this */ 
    struct __attribute__((__packed__)) ac { 
     int32_t slewRate; 
     int32_t voltage; 
     int32_t iLimit; 
     int32_t ovp; 
     bool dcMode; 
    }; 

    struct __attribute__((__packed__)) xfmr {  // 4 bytes 
     int32_t ocp; 
    } xfmr; 
    uint16_t extOtp[2];      // 4 bytes 
} settingsProfile_t; 

謝謝!

+1

請記住,在您使用的類型中,數字是位數。所以對於'int32_t',它是一個32位整數,32位是4個字節。這意味着兩個'int32_t'成員的結構將是8個字節,並且在這些結構的四個數組中,您有8 * 4(32)個字節。這意味着你所有的手動尺寸計算都是錯誤的。 –

+0

哦拍!我在實際的代碼中使用WORDS語言,在寫這裏的時候忘了加倍大小,現在更新ta。 – Toby

回答

1

struct是一種不是一個變量:

... 
/* 18 bytes, so if the above *isn't* 32 it should be below this */ 
    struct __attribute__((__packed__)) ac { 
     int32_t slewRate; 
     int32_t voltage; 
     int32_t iLimit; 
     int32_t ovp; 
     bool dcMode; 
    }; 
... 

所以它的大小將不會被包含在sizeof(settingsProfile_t)

你可能在尋找:

typedef struct __attribute__((__packed__)) settingsProfile { 
    uint16_t extOtp[2];      // 4 bytes 
    struct __attribute__((__packed__)) xfmr {  // 4 bytes 
     int32_t ocp; 
    } xfmr; 

    // total 17 
    struct __attribute__((__packed__)) ac { 
     int32_t slewRate;      // 4 
     int32_t voltage;       // 4 
     int32_t iLimit;       // 4 
     int32_t ovp;        // 4 
     bool dcMode;       // 1 
    } foo; // << ***here*** 

    // total 32 
    struct __attribute__((__packed__)) load { 
     int32_t slewRate;      // 4 
     int32_t current;       // 4 
    } load[4]; 

} settingsProfile_t; 

在我的編譯器總sizeof(settingsProfile_t)。如數字解釋,是57