1、為什麼需要記憶體對齊?
只是為了加快cpu對與記憶體的讀取速度
2、記憶體對齊在結構體中是如何計算結構體大小的?
**起始位置按照0x00來計算,**首先qt,vs,windows是預設按照八字節對齊的,linux32位是四位元組對齊,64位是8位元組對齊。還可以用#pragma (n)手動設定對齊位元組數,n只能等於,1,2,4,8,16
除結構體第乙個變數之外,其餘所有變數的起始位址的偏移量必須是n的整數倍(你是預設對齊位元組和變數本身大小,兩個值之間的最小值)
結構體整體大小必須是實際對齊單位的整數倍(計算實際對齊單位是看結構體內最大的變數所佔位元組數和預設偏移量之間的最小值)
比如
struct test1
x;printf
("sizeof(struct test1)=%d\n"
,sizeof
(struct test1));
//結果是24
運用上面得方法計算如下:
char a為0x00-0x02;2位元組
char b為0x02-0x03;1個位元組(偏移量是自身大小的整數倍就行所以是1)
char c為0x03-0x04為1位元組,
char f為0x04-0x05;1位元組,
int d為0x08-0x11(int的偏移量必須是4的整數倍,所以只能為0x08-0x0b),
double e;位址為0x16-0x23;(起始位址必須是8的整數倍),
然後現在整個結構體大小是24,是最小對齊數8的整數倍,ok
結構體中有陣列怎麼解決,比如說加入char c[11],這裡直接看作11個char去處理就好了
比如
struct test1
x;printf
("sizeof(struct test1)=%d\n"
,sizeof
(struct test1));
//結果是40
char a為0x00-0x02;2位元組
char b為0x02-0x03;1個位元組(偏移量是自身大小的整數倍就行所以是1)
char c為0x03-0x04為1位元組,
char f為0x04-0x05;1位元組,
int d為0x08-0x11(int的偏移量必須是4的整數倍,所以只能為0x08-0x0b),
double e;位址為0x16-0x23;(起始位址必須是8的整數倍),
char cc[11],位址就是0x23-0x33,
這時整個結構體大小是34,不是最小對齊量8的倍數,所以,結構體大小應該是40
對於結構體中巢狀結構體怎麼計算
1、把巢狀進去的子結構體也當作乙個變數,
2、計算該結構體的偏移位址,應該是該結構體內的結構體內最大記憶體的變數和預設的偏移量的整數倍
如
struct son
son;
//大小是40
struct parent
;printf
("sizeof(struct parent)=%d\n"
,sizeof
(struct parent));
//答案48
計算:
parent裡面開始是
char aa 為0x00-0x01;
int bb;為0x03-07;
struct son son1為0x07-0x47;所以大小是48
總結就是:
1、起始元素不用在意偏移量,其他元素的起始位置應該是(其自身大小和預設偏移量之間的最小值)的整數倍
2、遇到陣列,直接轉化為n個重複的陣列元素,如int a[13],直接看成 int a;int a;int a;…13個a,再用上面的規則去計算記憶體
3、遇到結構體內巢狀結構體,就把子結構體先計算記憶體,再計算子結構體對於父結構體的偏移量應該是(子結構體中的最大記憶體元素和預設偏移量之間的最小值)。從而計算父結構體內存。
附錄:常用位元組數(32位機):
int 乙個字 32位,4位元組
short 半個字 16位,2位元組
long 乙個字 32位,4位元組
char 1位元組
float 乙個字 32位 ,4位元組
double 兩個字 64位, 8位元組
關於記憶體對齊的小總結
對齊規則 1 資料成員對齊規則 結構 struct 或聯合 union 的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員的對齊按照 pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行。2 結構 或聯合 的整體對齊規則 在資料成員完成各自對齊之後,結構 或...
C struct記憶體對齊 union的大端小端
系統禁止編譯器在乙個結構的起始位置跳過幾個位元組來滿足邊界對齊要求,因此所有結構的起始儲存位置必須是結構中邊界要求最嚴格的資料型別所要求的位置。如某個機器的整型長度為4個位元組且它的起始儲存位置能夠被4整除,那麼結構體 struct allgn 在記憶體中的儲存的起始位置必須是乙個能夠被4整除的位址...
記憶體對齊 記憶體中的資料對齊 大端模式及小端模式
資料對齊,是指資料所在的記憶體位址必須是該資料長度的整數倍。dword資料的記憶體起始位址能被 4除盡,word 資料的記憶體起始位址能被 2除盡。x86 cpu 能直接訪問對齊的資料,當它試圖訪問乙個未對齊的資料時,會在內部進行一系列的調整。這些調整對於程式設計師來說是透明的,但是會降低執行速度,...