• <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>

            zhgw01

            內存對齊,little endian 和big endian

            在筆試中考到,雖然認識到是內存對齊的問題,最后還是做錯了,另外下面采用了big endian,一般的都是采用little endian

            class Test
            {
            public
             
            short int a;
             
            int b;
             
            char c[5];
            public:
             Test():b(0x
            1234),a(b){
              c[
            0]='h';
              c[
            1]='e';
              c[
            2]='l';
              c[
            3]='l';
              c[
            4]='o'//我是絕對這里應該賦值為'\0'
            }

            }


            int main()
            {
              Test t;
              cout
            <<a<<endl;
              cout
            <<b<<endl;
              cout
            <<sizeof(t)<<endl;
              
            char* p=(char*)&t;
              cout
            <<*(p+8)<<endl;
            }

            sizeof 那里考的就是內存對齊的問題,short int 的變量必須從模2為0的開始,int必須從模4為0 的開始,char必須從模1為0的開始,而整個Test依照它的成員中最大的,這里就是int,也就是Test的必須從模4為0的開始,而且它必須占4的倍數。
            為了滿足int的條件,short int后要填充(padding)兩個字節,為了滿足Test的條件,char[5]后必須填充3個字節,所以總共是2+2+4+5+3=16個字節
            具體的內存對齊可以參考如下
            英文:http://www.chinaitpower.com/2005September/2005-09-13/206312.html
            中文:http://blog.ednchina.com/jasony/92132/Message.aspx
            這樣*(p+8)也就很容易了解了,跳過前面8個字節,即short int 的2個,填充的2個,以及int的4個,最后跳到了c[0]

            little endian 和 big endian

            當一個變量占多個字節時,如何排列這些字節就產生出了little endian和big endian的區別
            little endian: 把低字節放在內存的低位 (The most significant byte is on the right end of a word)
            big endian: 把低字節放在內存的高位 (The most significant byte is on the left end of a word)
            舉個例子:
                 假設從地址0x00000000開始的一個字中保存有數據0x1234abcd,那么在兩種不同的內存順序的機器上從字節的角度去看的話分別表示為:
                   1)little endian:在內存中的存放順序是0x00000000-0xcd,0x00000001-0xab,0x00000002-0x34,0x00000003-0x12
                   2)big  endian:在內存中的存放順序是0x00000000-0x12,0x00000001-0x34,0x00000002-0xab,0x00000003-0xcd


            在構造函數中的Test():b(0x1234),a(b)看起來有問題,本來想這應該涉及到little endian和big endian的問題,不過在vs2005里調試了一下,發現由于a比b先聲明,所以實際上時a先初始化,也就是a(b)這個語句先運行,由于這時候b還沒初始化,a的值就是一個隨機數(相對于不同的運行來說),接著b再初始化為正確值,但是這時候已經無法改變a的值了

            posted on 2008-10-27 17:17 apacs 閱讀(587) 評論(0)  編輯 收藏 引用 所屬分類: c++

            My Links

            Blog Stats

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            日产久久强奸免费的看| 亚洲精品高清一二区久久| 无码日韩人妻精品久久蜜桃| 伊人久久一区二区三区无码| 久久婷婷是五月综合色狠狠| 亚洲狠狠婷婷综合久久蜜芽| 久久久久夜夜夜精品国产| 久久综合精品国产一区二区三区 | 久久亚洲欧洲国产综合| 综合人妻久久一区二区精品| 午夜精品久久久内射近拍高清| 久久丫忘忧草产品| 国产精品久久久久AV福利动漫| 免费一级欧美大片久久网| 久久久久国产精品熟女影院| 久久国产热这里只有精品| 久久久久高潮毛片免费全部播放 | 久久久精品日本一区二区三区| 狠狠色婷婷久久综合频道日韩| 亚洲午夜久久影院| 久久久久亚洲av无码专区| 香蕉aa三级久久毛片| 久久最近最新中文字幕大全| 久久无码AV中文出轨人妻| 久久免费视频6| 韩国三级中文字幕hd久久精品| 久久国产精品无码一区二区三区| 亚洲精品99久久久久中文字幕| 一本大道加勒比久久综合| 国产午夜免费高清久久影院| 亚洲中文字幕久久精品无码喷水| 亚洲欧洲精品成人久久曰影片| 久久99精品国产麻豆蜜芽| 国产精品欧美亚洲韩国日本久久| 久久99国产精品久久99| 99久久婷婷国产综合亚洲| 看全色黄大色大片免费久久久| 国内精品久久久久久久久电影网| 青春久久| 伊人伊成久久人综合网777| 色婷婷狠狠久久综合五月|