結構體對齊

2021-06-27 00:57:33 字數 754 閱讀 9403

結構體對齊方式:

1. #pragma pack[x],32系統預設值4,結構體元素最大長度,取三者最小值,作為每個元素對齊計算的值的倍數,並且總和是最小值的倍數!(假的)

於2015/12/26/修改

1. 資料成員對齊原則

結構或聯合的資料成員,第乙個資料成員放在offset為0的地方,以後每個成員按照#pragma pack(n)和成員本身值比較小那個進行對齊,offset是該值的整數倍

2. 整體對齊原則

在資料成員完成各自對齊之後,結構或聯合本身也要對齊,對齊原則按照#pragma pack(n)指定的數值和結構最大資料成員長度中,比較小的那個值進行比較

3.巢狀結構體對齊原則

巢狀的內部結構體對齊原則是按照該結構體內部的最長元素與pragma指定的n最小值作為對齊的值

4.陣列對齊原則

按照陣列型別算,比如char a[3],實際上是按照1個位元組對齊的,offset還是按照陣列大小

5. 如果沒有定義#pragma pack(),則按照自身的長度對齊

#include

#include

//#pragma pack(1)

struct demo

;struct test

;struct module

;int main(void)

{ printf("sizeof(test) is %d\n", sizeof(struct test));

參考:

結構體對齊

現在去掉第乙個成員變數為如下 pragma pack 4 class testc int nsize sizeof testc 按照正常的填充方式nsize的結果應該是8,為什麼結果顯示nsize為6呢?事實上,很多人對 pragma pack的理解是錯誤的。pragma pack規定的對齊長度,實...

結構體對齊

結構體對齊問題 以下結論均在gnu gcc上驗證 概念 偏移量 成員位址相對結構體位址的偏移 對齊原則 1.結構體中某成員的偏移量必須是該成員型別大小的整數倍 b 的偏移量必須是 short 大小的整數倍,故在 a 後面填充乙個位元組 c 的 型別大小是double,在ansi c中,c 的偏移量是...

結構體對齊

c 資料對齊 為了避免混淆,做如下規定,以下 若不加特殊說明都執行於32位平台,結構體的預設對齊值是8,各資料型別所佔位元組數分別為 char佔乙個位元組 int佔四個位元組 double佔八個位元組。請問下面的結構體大小是多少?struct test 這個呢?struct test1 在公布答案之...