題目:
#PRagma pack(8)struct s1{short a;long b;};struct s2{char c;s1 d;long long e;};#pragma pack()問 1.sizeof(s2) = ? 2.s2的s1中的c后面空了幾個字節接著是d?
正確答案: sizeof(S2)結果為24. 成員對齊有一個重要的條件,即每個成員分別對齊.即每個成員按自己的方式對齊. 也就是說上面雖然指定了按8字節對齊,但并不是所有的成員都是以8字節對齊.其對齊的規則是,每個成員按其類型的對齊參數(通常是這個類型的大小)和指定對齊參數(這里是8字節)中較小的一個對齊.并且結構的長度必須為所用過的所有對齊參數的整數倍,不夠就補空字節.
S1中,成員a是1字節默認按1字節對齊,指定對齊參數為8,這兩個值中取1,a按1字節對齊;成員b是4個字節,默認是按4字節對齊,這時就按4字節對齊,所以sizeof(S1)應該為8;
S2中,c和S1中的a一樣,按1字節對齊,而d 是個結構,它是8個字節,它按什么對齊呢?對于結構來說,它的默認對齊方式就是它的所有成員使用的對齊參數中最大的一個,S1的就是4.所以,成員d就是按4字節對齊.成員e是8個字節,它是默認按8字節對齊,和指定的一樣,所以它對到8字節的邊界上,這時,已經使用了12個字節了,所以又添加了4個字節的空,從第16個字節開始放置成員e.這時,長度為24,已經可以被8(成員e按8字節對齊)整除.這樣,一共使用了24個字節.
a b S1的內存布局:11**,1111, c S1.a S1.b d S2的內存布局:1***,11**,1111,****11111111
這里有三點很重要: 1.每個成員分別按自己的方式對齊,并能最小化長度 2.復雜類型(如結構)的默認對齊方式是它最長的成員的對齊方式,這樣在成員是復雜類型時,可以最小化長度 3.對齊后的長度必須是成員中最大的對齊參數的整數倍,這樣在處理數組時可以保證每一項都邊界對齊
此外,對于數組,比如:char a[3]; 它的對齊方式和分別寫3個char是一樣的,也就是說它還是按1個字節對齊. 如果寫: typedef char Array3[3]; Array3這種類型的對齊方式還是按1個字節對齊,而不是按它的長度. 不論類型是什么,對齊的邊界一定是1,2,4,8,16,32,64….中的一個.
新聞熱點
疑難解答