sizeof:對齊問題

          因為對齊問題使結構體的sizeof變得比較復雜,看下面的例子:(默認對齊方式下)

          struct s1
          {
          char a;
          double b;
          int c;
          char d; 
          };

          struct s2
          {
          char a;
          char b;
          int c;
          double d;
          };

          cout<<sizeof(s1)<<endl; // 24
          cout<<sizeof(s2)<<endl; // 16

            
          同樣是兩個char類型,一個int類型,一個double類型,但是因為對界問題,導致他們的大小不同。計算結構體大小可以采用元素擺放法,我舉例子說明一下:首先,CPU判斷結構體的對界,根據上一節的結論,s1s2的對界都取最大的元素類型,也就是double類型的對界8。然后開始擺放每個元素。
            
          對于s1,首先把a放到8的對界,假定是0,此時下一個空閑的地址是1,但是下一個元素ddouble類型,要放到8的對界上,離1最接近的地址是8了,所以d被放在了8,此時下一個空閑地址變成了16,下一個元素c的對界是416可以滿足,所以c放在了16,此時下一個空閑地址變成了20,下一個元素d需要對界1,也正好落在對界上,所以d放在了20,結構體在地址21處結束。由于s1的大小需要是8的倍數,所以21-23的空間被保留,s1的大小變成了24
            
          對于s2,首先把a放到8的對界,假定是0,此時下一個空閑地址是1,下一個元素的對界也是1,所以b擺放在1,下一個空閑地址變成了2;下一個元素c的對界是4,所以取離2最近的地址4擺放c,下一個空閑地址變成了8,下一個元素d的對界是8,所以d擺放在8,所有元素擺放完畢,結構體在15處結束,占用總空間為16,正好是8的倍數。

            
          這里有個陷阱,對于結構體中的結構體成員,不要認為它的對齊方式就是他的大小,看下面的例子:

          struct s1
          {
          char a[8];
          };

          struct s2
          {
          double d;
          };

          struct s3
          {
          s1 s;
          char a;
          };

          struct s4
          {
          s2 s;
          char a; 
          };

          cout<<sizeof(s1)<<endl; // 8
          cout<<sizeof(s2)<<endl; // 8
          cout<<sizeof(s3)<<endl; // 9
          cout<<sizeof(s4)<<endl; // 16;

            s1
          s2大小雖然都是8,但是s1的對齊方式是1s28double),所以在s3s4中才有這樣的差異。

            
          所以,在自己定義結構體的時候,如果空間緊張的話,最好考慮對齊因素來排列結構體里的元素。

          posted on 2009-05-16 18:11 蔣耘 閱讀(666) 評論(0)  編輯  收藏 所屬分類: C/C++

          <2009年5月>
          262728293012
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 永城市| 德格县| 涞源县| 高碑店市| 长治县| 虎林市| 南木林县| 成安县| 枞阳县| 汝州市| 大同市| 晋江市| 崇礼县| 舞阳县| 砀山县| 沅陵县| 色达县| 嘉鱼县| 威信县| 宁陕县| 慈溪市| 宁波市| 新巴尔虎左旗| 吴忠市| 乐亭县| 铁岭市| 赤城县| 思茅市| 铜陵市| 杨浦区| 改则县| 巢湖市| 高陵县| 塔河县| 江油市| 涞水县| 当涂县| 黔西县| 通辽市| 利津县| 饶平县|