關於記憶體對齊的幾點記憶

2021-10-03 10:28:39 字數 1326 閱讀 4103

記憶體對齊的四大規則:

第乙個成員在與結構體變數偏移量為0的位置處。

其他成員變數要對齊到某個數字(對其數)的整數倍的位址處。對其數=編譯器預設的乙個對齊數與該成員大小的較小者。

vs中預設的值是8

linux中預設的值是4

結構體總大小為最大對其數(每乙個成員變數都有乙個對其數)的整數倍。

如果巢狀了結構體對齊到自己的最大對其數是整數倍處,結構體的整體大小就是最大對齊數(含巢狀結構體的對齊數)的整數倍。

注:在第二條中,是該成員,是當前的那個成員,不是其他的。

另一種說法(與四大規則的含義是一樣的):

對於結構的各個成員,第乙個成員位於偏移為0的位置,以後每個資料成員的偏移量必須是min(#pragma pack()指定的數,這個資料成員的自身長度) 的倍數。

在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。

注:#pragma pack的用法為#pragma pack(n),n可以取值為1 2 3等,表示設定為n位元組對齊

舉列說明:

struct st1 

;

st1 :char佔乙個位元組,起始偏移為0 ,int佔4個位元組,#pragma pack()指定的數與這個資料成員的自身長度之前的較小值4(vc6預設8位元組對齊),所以int按4位元組對齊,起始偏移必須為4的倍數,所以起始偏移為4,在char後編譯器會新增3個位元組的額外位元組,不存放任意資料。short佔2個位元組,按2位元組對齊,起始偏移為8,8正好是2的倍數,無須新增額外位元組。到此第一次對齊結束,此時的記憶體狀態為:

o***|oooo|oo
此時共佔10個位元組。還要繼續進行結構本身的對齊,即第二次對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,較小的那個數進行對齊,st1結構中最大資料成員長度為int,佔4位元組,而預設的#pragma pack指定的值為8,所以結果取兩之較小數即按照4位元組對齊,結構總大小必須為4的倍數,需新增2個額外位元組使結構的總大小為12 。此時的記憶體狀態為:

o***|oooo|ooxx
到此記憶體對齊結束。st1占用了12個位元組而非7個位元組。

關於記憶體對齊

資料傳送到網路板的資料報大小根本不是實際控制數 據包的大小 這時我才想起乙個人,stanley b.lippman,他寫的那 一本書 inside object modale 曾經提過這樣的事 情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上...

關於記憶體對齊

早上看了乙個貼的面試題,struct st int i short s char c sizeof struct st 是多少?int 4,short 2,char 1,但是sizeof st 是8。這個就是記憶體對齊 再來看個例子 struct strt1 strt1 s1 假設s1.c1位址為0...

關於記憶體對齊

資料傳送到網路板的資料報大小根本不是實際控制資料報的大小 這時我才想起乙個人,stanley b.lippman,他寫的那一本書 inside object modale 曾經提過這樣的事情,編譯器為了提高cpu的效率,會對struct 的結構進行優化,利用sizeof 可以得出不同的計算機上對 s...