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