ZHCUAV8W january 1998 – march 2023 66AK2E05 , 66AK2H06 , 66AK2H12 , 66AK2H14 , AM1705 , AM1707 , AM1802 , AM1806 , AM1808 , AM1810 , AM5K2E04 , OMAP-L132 , OMAP-L137 , OMAP-L138 , SM470R1B1M-HT , TMS470R1A288 , TMS470R1A384 , TMS470R1A64 , TMS470R1B1M , TMS470R1B512 , TMS470R1B768
編譯器支持以下類型屬性:
結(jié)構(gòu)體和聯(lián)合體類型都支持 packed 屬性。如果使用了 --relaxed_ansi 選項,則在所有 ARM 目標(biāo)上都受支持。請參閱 --unaligned_access 選項說明,了解更多有關(guān)編譯器如何訪問未對齊數(shù)據(jù)的信息。
壓縮結(jié)構(gòu)的成員在存儲時會盡可能靠近彼此,并會忽略通常為保持字對齊而添加的額外填充字節(jié)。例如,假定一個 4 個字節(jié)的字大小通常在成員 c1 和 i 之間具有 3 個填充字節(jié),在成員 c2 后具有另外 3 個填充字節(jié),因此總大小為 12 個字節(jié):
struct unpacked_struct { char c1; int i; char c2;}; 不過,壓縮結(jié)構(gòu)的成員是字節(jié)對齊的。因此,以下示例中成員之間或之后沒有任何填充字節(jié),總共為 6 個字節(jié):
struct __attribute__((__packed__)) packed_struct { char c1; int i; char c2; };因此,數(shù)組中的壓縮結(jié)構(gòu)會壓縮在一起,數(shù)組元素之間沒有填充字節(jié)。
壓縮結(jié)構(gòu)的位字段是位對齊的。不是位字段的相鄰結(jié)構(gòu)成員的子節(jié)對齊方式不變。不過,相鄰位字段之間沒有填充位。
“packed”屬性只能應(yīng)用于結(jié)構(gòu)體或聯(lián)合體類型的原始定義。它不能通過 typedef 用于已定義的非壓縮結(jié)構(gòu),也不能用于結(jié)構(gòu)體或聯(lián)合體對象的聲明。因此,任意給定結(jié)構(gòu)體或聯(lián)合體類型都只能是壓縮或非壓縮,并且該類型的所有對象都會繼承其 packed 或 non-packed 屬性。
“packed”屬性不能遞歸應(yīng)用到壓縮結(jié)構(gòu)體中包含的結(jié)構(gòu)體類型。因此,在以下示例中,成員會保留與上方第一個示例相同的內(nèi)部布局。c 和 s 之間沒有填充字節(jié),因此 s 在未對齊的邊界上:
struct __attribute__((__packed__)) outer_packed_struct { char c; struct unpacked_struct s; };
以隱式或顯式方式將壓縮結(jié)構(gòu)體成員的地址作為指針投射到除無符號字符以外的任意非緊湊類型都是非法的。在以下示例中,p1、p2 和對 foo 的調(diào)用都是非法的。
void foo(int *param);
struct packed_struct ps;
int *p1 = &ps.i;
int *p2 = (int *)&ps.i;
foo(&ps.i);不過,以顯式方式將壓縮結(jié)構(gòu)體成員的地址作為指針投射到無符號字符則是合法的。
unsigned char *pc = (unsigned char *)&ps.i;
TI 編譯器還支持枚舉類型的 unpacked 屬性,讓您可以指示表現(xiàn)形式為不小于 int 的整型;也就是說,它不是 packed。