① 什麼是C語言結構體位元組對齊,為什麼要對齊
arm支持16bit和32bit的地址訪問,即變數地址能夠被2或4整除,這時性能比較好,也便於移植。結構體的對齊就是指的結構體內部的每個成員變數地址盡可能對齊到2或4位元組位置,如定義為:
struct{
char
ch1;
char
ch2;
short
ss;
int
i;
}var;
字元變數ch1,
ch2為位元組對齊,短整型變數ss為半字對齊,整型變數i為字對齊,結構體內的變數比較緊湊,且已自然對齊,結構體變數var佔用總空間為8個位元組。如果改為這樣:
struct{
char
ch1;
short
ss;
char
ch2;
short
ss;
int
i;
}var;
var變數最終佔用的空間為12個位元組,存取這個結構體時比前面那個需要的時間要多,另外如果用pack(1)指定結構體位元組對齊的話,後面的方式移植到其它系統可能會出現死機問題。
② ARM微處理器中支持位元組、半字、字三種數據類型,地址的低兩位為0是啥意思
1、字對齊數據,也就是說每個數據都是用字(32位)來表示的,而ARM中的存儲單元都是以位元組為單位,那麼要索引一個數據,需要連續的4個位元組才行,比如,0x0000_0000~0x0000_0003這四個單元存儲一個數據,緊接著0x0000_0004~0x0000_0007這四個單元存儲第二個數據,那麼依此類推,每個數據的存儲起始地址為:
0x0000_0000
0x0000_0004
0x0000_0008
0x0000_000c
0x0000_0010
0x0000_0014
......
可見,這些數據的地址最後一個十六進制位按照0、4、8、c循環,而對應的二進制為0000、0100、1000、1100。看出來了吧,這些數由於是0x4(0100b)的整數倍,最後兩位都是"00"。
2、同理,半字就是兩個位元組,那麼地址是:
0x0000_0000
0x0000_0002
0x0000_0004
......
由於都是0x2(10b)的整數倍,所以地址的最後一個二進制位都為"0"。
3、位元組類型數據就是每個位元組地址都用上了。
明白了嗎?