青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

攀升·Uranus


Something Different,Something New
數據加載中……

結構體對齊那點事 熟練c/c++(四)

          剛剛完成一個文件的遷移程序,其中遇到了結構體對齊的問題,所以拿出來說說,與各位博友們分享。

我的程序很簡單,就是把之前通過一個結構體fwrite到文件A里的內容讀出,然后轉給另一個結構體保存。程序是簡單,但我擔心的是之前結構體fwrite到文件A的程序對齊結構體規則是怎樣的?一定要知道它嗎? 當然了,如果那個程序結構體是按照1對齊寫入的,我的程序結構體是按照4對齊讀入,那不就糟了!

      這里我引入結構體對齊的概念,也可以說是內存對齊了。為什么要內存對齊呢,就是方便CPU尋址了,具體原因大家要參考計算機體系結構了。先看一個內存對齊的例子:

      struct example1{

           char a;

           double b;

           long l;

};

      struct example2{

           char a;

           long l;

           double b;

};

大家算算結構體大小,初次接觸的博友可能對答案有點驚訝,VC編譯, sizeof后結果分別是:2416 同樣是的結構體,成員換了順序,大小就不同了。其實內存對齊有個規則,只要知道了,就OK。那么以下5點是關鍵

1.          內存對齊與編譯器設置有關,首先要搞清編譯器這個默認值是多少

2.          如果不想編譯器默認的話,可以通過#pragma pack(n)來指定按照n對齊

3.          每個結構體變量對齊,如果對齊參數n(編譯器默認或者通過pragma指定)大于該變量所占字節數(m),那么就按照m對齊,內存偏移后的地址是m的倍數,否則是按照n對齊,內存偏移后的地址是n的倍數。也就是最小化長度規則

4.          結構體總大小: 對齊后的長度必須是成員中最大的對齊參數的整數倍。最大對齊參數是從第三步得到的。

5.          補充:如果結構體A中還要結構體B,那么B的對齊方式是選它里面最長的成員的對齊方式

所以計算結構體大小要走三步,首先確定是當前程序按照幾對齊(參照12),接著計算每個結構體變量的大小和偏移(參照35),最后計算結構體總大小(參照4)。

      先算算example1吧,假設編譯器是以16對齊的

      1.確定按照幾對齊: 16;

      2.確定每個成員的偏移:a 占一個字節,16>1, 按照1對齊,起始位置00%1 = 0,那么a就存在0位置;b8個字節,16>8,按照8對齊,起始位置就不能是1了,因為要按照8對齊,所以最近的偏移起始位置是8 8%8 =0, 那么b就存在位置8-15的位置;l4個字節,16>4,按照4對齊,起始位置16 16%4=0,那么l就存在位置16-19的位置。所以結構體從019一共占用20個字節

      3.結構體總大小:成員中最大的對齊參數是b8對齊,所以208!=0, 24剛好。

      真的很搞!同理計算example2應該是16

     再舉個結構體嵌套的例子吧,

#pragma pack(push)

#pragma pack(8)

struct test1{

      int a;

      char b;

      int c[20]

long l;

} ;

struct test2{

      char a1;

      char a2;

      struct test1 t1;

      double b1;

}

#pragma pack(pop)

先計算test1, 8對齊,a占用0-3b占用4c占用887l占用8891,一共92個字節。成員中最大的對齊參數是int92%4=0;

再計算test2, a1z占用0a2占用1t1呢,4 % 4 (test1里面最長的成員的對齊方式) = 0, 4-95b196103;一共104個字節,成員中最大的對齊參數是double104%8=0; 所以是104.


      那關于我文章開頭提到的那個文件轉換,我現在只要知道原始程序是按照什么對齊的,然后在新程序中指定按照幾對齊就可以了,哈哈!            
      
      擠時間寫的,
有的地方有遺漏,請各位指正!

posted on 2009-01-06 23:39 攀升 閱讀(8891) 評論(9)  編輯 收藏 引用 所屬分類: C/C++

評論

# re: 結構體對齊那點事 熟練c/c++(四)   回復  更多評論   

恩. 很有道理
2009-01-07 11:13 | li_young

# re: 結構體對齊那點事 熟練c/c++(四)   回復  更多評論   

在gcc下example1和example2都是16
2009-01-07 12:53 | ronliu

# re: 結構體對齊那點事 熟練c/c++(四)   回復  更多評論   

在gcc下example1和example2都是16 中默認字節對齊為4 所以都是16
2009-01-07 16:57 | feosun

# re: 結構體對齊那點事 熟練c/c++(四)   回復  更多評論   

@ronliu
博友feosun告訴了你答案
所以為了防止不同編譯器對齊不一樣,我建議在代碼里面指定對齊參數
#pragma pack(n)
2009-01-07 18:14 | 攀升

# re: 結構體對齊那點事 熟練c/c++(四)   回復  更多評論   

內存對齊一直是很熱的話題啊。。呵呵。。。
2009-01-08 08:38 | guest

# re: 結構體對齊那點事 熟練c/c++(四)   回復  更多評論   

有個地方沒太看懂
就是嵌套結構體時,如何決定嵌套結構體的首地址?即文中"t1呢,92%2!=0, 2-92"這一段,不是說考慮結構體大小時,應該為其成員的最大值么?
2009-08-31 10:54 | 游客

# re: 結構體對齊那點事 熟練c/c++(四)   回復  更多評論   

能否把我給你的評論(最前面的兩條中有)刪掉,我的留言中使用了郵件地址,收到了無數的垃圾郵件,煩都煩死了。如果可以,真的不勝感激
2009-10-16 22:09 | 你好!

# re: 結構體對齊那點事 熟練c/c++(四)   回復  更多評論   

@你好!
我幫你處理了,哈哈
2010-01-14 23:12 | 攀升

# re: 結構體對齊那點事 熟練c/c++(四)   回復  更多評論   

@游客
>有個地方沒太看懂
>就是嵌套結構體時,如何決定嵌套結構體的首地址?即文中"t1呢,92%2!>=0, 2-92"這一段,不是說考慮結構體大小時,應該為其成員的最大值么?

謝謝你的提醒,我改好了,呵呵
2010-01-14 23:24 | 攀升
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美大片专区| 亚洲伊人久久综合| 美女脱光内衣内裤视频久久影院 | 国产麻豆9l精品三级站| 欧美激情第三页| 国产亚洲成av人片在线观看桃| 欧美一区二区三区精品| 久久精品综合一区| 亚洲麻豆国产自偷在线| 一区二区三区日韩精品视频| 国产日产精品一区二区三区四区的观看方式 | 欧美在线观看一区| 久久青草福利网站| 一本一本大道香蕉久在线精品| 一本高清dvd不卡在线观看| 国产日韩欧美黄色| 亚洲高清色综合| 欧美体内she精视频| 久久av在线看| 欧美国产视频一区二区| 性欧美大战久久久久久久久| 久久亚洲精品一区二区| 亚洲一区视频在线观看视频| 久久精品女人天堂| 一区二区电影免费观看| 欧美有码在线观看视频| 99国产一区二区三精品乱码| 性欧美videos另类喷潮| 一本久久a久久精品亚洲| 欧美一区二区三区四区在线观看| 日韩视频一区二区三区| 欧美在线电影| 亚洲女性喷水在线观看一区| 久久综合色影院| 久久国产精品久久精品国产| 欧美极品影院| 麻豆91精品| 国产日韩在线看片| 99亚洲精品| 99精品国产一区二区青青牛奶| 欧美一区二区啪啪| 亚洲伊人一本大道中文字幕| 欧美福利一区| 欧美国产精品人人做人人爱| 好吊日精品视频| 亚洲一区国产| 可以看av的网站久久看| 欧美激情亚洲一区| 国产日韩欧美黄色| 国产精品99久久久久久久久| 日韩一二三区视频| 久久综合网络一区二区| 久久人人爽爽爽人久久久| 国产人久久人人人人爽| 亚洲永久精品大片| 亚洲欧美国产视频| 欧美色图一区二区三区| 日韩一级精品视频在线观看| 日韩午夜av在线| 欧美高清视频在线观看| 欧美激情91| 亚洲日本va在线观看| 久久综合久色欧美综合狠狠 | 91久久精品国产91久久| 久色婷婷小香蕉久久| 美女精品网站| 欲香欲色天天天综合和网| 久久久精品一品道一区| 狼狼综合久久久久综合网| 狠狠色狠色综合曰曰| 久久久久国产一区二区三区四区 | 亚洲精品日本| 亚洲午夜视频| 国产久一道中文一区| 亚洲欧美国产日韩天堂区| 久久久国产成人精品| 尤物精品在线| 欧美国产精品va在线观看| 亚洲精品综合在线| 亚洲在线观看视频网站| 国产日韩综合| 久久久久久夜| 亚洲精品在线免费| 午夜亚洲影视| 一区二区自拍| 欧美日韩免费区域视频在线观看| 一区二区三区福利| 久久久久天天天天| 亚洲另类自拍| 国产欧美日韩视频一区二区三区| 久久精品99久久香蕉国产色戒| 亚洲国产精品电影| 午夜在线一区二区| 亚洲国产精品国自产拍av秋霞| 欧美日韩国产一区二区三区地区| 亚洲一区二区三区三| 免费永久网站黄欧美| 亚洲一区视频在线| 伊人伊人伊人久久| 欧美亚男人的天堂| 美女主播视频一区| 亚洲在线成人精品| 91久久久久久| 久久久久久久综合日本| 日韩视频一区| 激情久久久久久| 国产精品久久97| 欧美激情第三页| 久久精品国产99国产精品澳门 | 国产精品网站视频| 老司机凹凸av亚洲导航| 亚洲素人一区二区| 欧美激情一区三区| 久久久成人网| 性欧美xxxx大乳国产app| 最新日韩在线| 一区在线视频| 国产欧美日韩综合一区在线观看 | 欧美视频日韩视频| 免费欧美网站| 久久久7777| 欧美一区二区三区喷汁尤物| 一本大道久久精品懂色aⅴ| 欧美激情1区2区| 欧美成人嫩草网站| 久久一区二区三区av| 久久福利影视| 欧美综合77777色婷婷| 亚洲一区二区少妇| 亚洲天堂成人在线观看| 日韩一级片网址| 91久久视频| 亚洲国产另类 国产精品国产免费| 国内精品视频666| 国产午夜精品福利| 国产女人精品视频| 国产欧美精品日韩精品| 国产精品久久久久久久久久久久久久 | 玖玖玖国产精品| 久久中文精品| 美女视频黄a大片欧美| 久久午夜国产精品| 久久综合图片| 欧美二区乱c少妇| 欧美激情成人在线视频| 欧美成人免费va影院高清| 欧美福利一区| 亚洲人成在线观看一区二区| 亚洲国产精品第一区二区| 亚洲国产欧美一区二区三区丁香婷| 欧美刺激午夜性久久久久久久| 欧美成人一区在线| 亚洲国内在线| 一本色道久久综合亚洲精品不卡| 一本一本久久a久久精品牛牛影视| 一区二区成人精品| 午夜久久美女| 久久久精品国产免费观看同学| 另类酷文…触手系列精品集v1小说| 美女精品一区| 欧美日韩伊人| 国产亚洲欧美日韩日本| **欧美日韩vr在线| 一个人看的www久久| 午夜精品视频网站| 麻豆国产精品777777在线| 欧美黑人多人双交| 中国女人久久久| 久久久久成人网| 欧美伦理a级免费电影| 国产精品视频精品| 亚洲国产精品va在线看黑人| 亚洲视频在线一区观看| 久久精品日韩欧美| 亚洲精品三级| 欧美在线1区| 欧美日韩国产区一| 国语自产精品视频在线看8查询8| 日韩一二在线观看| 久久久久久久欧美精品| 日韩网站在线| 欧美大色视频| 午夜精品久久| 欧美一区二区三区精品| 欧美丰满高潮xxxx喷水动漫| 国产日韩视频| 亚洲社区在线观看| 欧美国产成人在线| 午夜精品久久久久久久99热浪潮| 欧美a级片网| 国产一区二区精品丝袜| 亚洲一区二区三区精品在线观看| 老司机久久99久久精品播放免费| 亚洲天堂av在线免费| 免费在线视频一区| 狠狠色狠狠色综合| 新狼窝色av性久久久久久| 亚洲黄网站在线观看| 久久久久久久久一区二区| 国产日韩一区|