1、測試平台
本次實驗的平台以32位cortexm0微控制器,不同的平台的實驗結果可能是不一樣的,但是思路都一樣。
2、基礎概念
先介紹三個概念:自身對齊值、指定對齊值、有效對齊值。
自身對齊值:資料型別本身的對齊值,例如char型別的自身對齊值是1,short型別是2,int型別是4;
指定對齊值:編譯器或程式設計師指定的對齊值,32位微控制器的指定對齊值預設是4;
有效對齊值:自身對齊值和指定對齊值中較小的那個。
對齊有兩個規則:
1、不但結構體的成員有有效對齊值,結構體本身也有對齊值,這主要是考慮結構體的陣列,對於結構體或者類,要將其補齊為其有效對齊值的整數倍。而結構體的有效對齊值是其最大資料成員的自身對齊值;
2、存放成員的起始位址必須是該成員有效對齊值的整數倍。
3、開始測試
先舉幾個例子,假設以下所有的結構體的起始位址都是0x0000 0000
#pragma pack(4)
typedef
struct a
structa;
#pragma pack()
#pragma pack(4)
typedef
struct b
structb;
#pragma pack()
#pragma pack(4)
typedef
struct c
structc;
#pragma pack()
4、測試**structa a;
structb b;
structc c;
volatile u32 len_a, len_b, len_c;
void
align_test
(void
)
5、測試結果
同時我們也能看到,所有的由編譯器自己分配的結構體的首位址,一定是4位元組對齊的,例如結構體a的首位址是0x100040f4,結構體b的首位址是0x100040fa,結構體c的首位址是0x10004b18,因此不用擔心結構體的首位址的位元組對齊問題,而只需要關心結構體成員和結構體總長度的位元組對齊問題。
6、思考題
這裡涉及到大小端的問題,對於小端的mcu,高位址存放高位元組,低位址存放低位元組,例如本試驗中,0x0002存放在2、3位址中,3位址存放0x00,2位址存放0x02,請看下圖。
如果是大端的mcu,高位址存放低位元組,低位址存放高位元組,結果就會反過來,這也是程式設計中常常需要留意的問題了。
stm32中位元組對齊問題( align n ,
arm下的對齊處理 from dui0067d ads1 2 complib 3.13 type qulifiers 有部分摘自arm編譯器文件對齊部分 對齊的使用 1.align num 這個用於修改最高端別物件的位元組邊界。在彙編中使用ldrd或者strd時 就要用到此命令 align 8 進行...
結構體位元組對齊的規則
位元組對齊的計算規則 1 先看結構中最大型別的資料,包括巢狀結構體 如果有 確定一行的最大數。2 如果只有乙個元素,那就是這個元素的大小,不需要補齊。4 巢狀子結構體則要看看這個元素的整個大小 就是累加的大小,不是對齊的大小 放到這一排的剩餘位置能不能放下,放不下則從下一行開始,子結構體中的元素排列...
結構體位元組對齊和位域對齊 VC gcc
分類 c c 2012 10 13 15 34 474人閱讀收藏 舉報 1 什麼是位元組對齊 乙個變數占用 n 個位元組,則該變數的起始位址必須能夠被 n 整除,即 存放起始地 址 n 0,對於結構體而言,這個 n 取其成員中的資料型別佔空間的值最大的那個。2 為什麼要位元組對齊 記憶體空間是按照位...