国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

字節對齊

2019-11-08 01:43:48
字體:
來源:轉載
供稿:網友

題目:

#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….中的一個.


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 高州市| 大港区| 普兰店市| 保靖县| 庐江县| 彝良县| 名山县| 宽甸| 泉州市| 南安市| 宁波市| 河曲县| 拜城县| 佛冈县| 应城市| 盘锦市| 新巴尔虎左旗| 宝山区| 石泉县| 宜章县| 凤台县| 北碚区| 西乌珠穆沁旗| 奉化市| 泉州市| 嫩江县| 蓬莱市| 金溪县| 崇阳县| 浠水县| 阳信县| 文成县| 北辰区| 贵港市| 定兴县| 黑水县| 尼玛县| 墨竹工卡县| 将乐县| 永定县| 安图县|