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

            山寨:不是最好的,是最適合我們的!歡迎體驗山寨 中文版MSDN

            Blog @ Blog

            當華美的葉片落盡,生命的脈絡才歷歷可見。 -- 聶魯達

            常用鏈接

            統計

            積分與排名

            BBS

            Blog

            Web

            最新評論

            C++中的尺寸[轉]

            轉自:http://blog.csdn.net/arong1234/archive/2008/03/23/2210462.aspx

            1. sizeof:返回類型的尺寸

             每個類型在編譯時都會決定自己的實例需要多少字節。在編譯后,該類型的所有對象占有的空間是一樣的,不會發生變化。因此,我們可以用sizeof來計算一個類型或者該類型的某個實例來得到尺寸信息。下面的代碼是等價的


            int iVal;
            //sizeof type
            sizeof(int)
            //sizeof instance
            sizeof(iVal)

            無論我們用iVal還是int,上面的表達式都會返回int類型的尺寸(當然如前所說,iVal的尺寸和其類型尺寸永遠是一樣的)。

            不熟悉sizeof的朋友往往會在處理指針時弄錯概念。考慮下面代碼:

            int iArray[10];
            int sizeofArray=sizeof(iArray);

            int * p= new int[10];
            int sizeofPointer = sizeof(p);

            在很多人心目中,指針和數組是等價的,但是事實嚴格起來并不如此。上面的代碼就會返回不同的結果。

            對于iArray,它的類型是int[10],是一個數組,sizeof計算其尺寸時,知道它包含10個元素,每個元素都時個整型,因此返回40。而對于p,它的類型是int*,指針的尺寸永遠是4,因此結果就是4。sizeof不會也不可能知道p實際指向10個元素的數組。

            出現這個問題的原因有兩個:1. sizeof是在編譯時計算的,而new int[10]指向的數組是在運行時創建的,也就是說當sizeof(p)計算時,系統還不知道p會指向多少個int元素,自然也不可能知道它指向的數組占有多少字節。2. sizeof計算的是p自己的類型所占據的空間,而不是p指向的對象所占據的空間,可以說,p自己占據4個字節,而p指向的空間占40字節。

            在這種概念下,我們是不是可以通過sizeof(*p)來得到40呢?很不幸,不行,原因是p的類型是int*,*p的類型是int,因此無法得到其是一個數組的事實。

            實際上,這個尺寸信息是個運行時數據,作為C/C++語言而言,是無從知道這個信息的(因為C/C++指針不包含這種信息),要得到它,唯一的辦法是指望操作系統在運行時中提供。在VC中,我們可以通過_msize得到。

            2. 對齊問題

            我們在訪問內存時,如果地址是按4字節對齊,則訪問效率會高很多。這個問題的原因在于訪問內存的硬件電路。一般情況下,地址總線總是按照對齊后的地址來訪問。例如你想得到0x00000001開始的4字節內容,系統首先需要以0x00000000讀4字節,然后從中取得3字節,然后在用0x00000004作為開始地址,獲得下一個四字節,在從中得到第一個字節,兩次組合出你想得到的內容。但是如果地址一開始就是對齊到0x00000000,則系統只要一次讀寫即可。

            為了性能考慮,編譯器會對結構進行對齊處理。考慮下面的結構

             

            struct aStruct
            {
                           
            char cValue;
                           
            int    iValue;
            }
            ;

             

            直觀的講,這個結構的尺寸是sizeof(char)+sizeof(int)=5,但是在實際編譯下,這個結構尺寸缺省是8,因為第二個域ivalue會被對齊到第四個字節。

            在VC中,我們可以用pack預處理指令來禁止對齊調整。例如,下面代碼將使得結構尺寸更加緊湊,不會出現對齊到4字節問題:

             

            #pragma pack(1)
            struct aStruct{
                 
            char cValue;
                
            int     iValue;
            }
            ;
            #pragma pack()

            對于這個pack指令的含義,大家可以查詢MSDN。請注意:除非你覺得必須這樣,不要輕易做這樣的調整,因為這將降低程序性能。目前比較常見的用法是:1. 這個結構需要被直接寫入文件 2. 這個結構需要通過網絡傳給其他程序。

            注意:字節對齊是編譯時決定的,一旦決定不會再改變,因此即使有對齊的因素在,也不會出現一個結構在運行時尺寸發生變化的情況出現。

            posted on 2008-05-25 21:53 isabc 閱讀(384) 評論(0)  編輯 收藏 引用 所屬分類: C++基礎

            廣告信息(免費廣告聯系)

            中文版MSDN:
            歡迎體驗

            久久精品国产91久久麻豆自制| 久久婷婷五月综合97色一本一本 | 国产午夜精品久久久久免费视| 亚洲精品美女久久久久99| 一本久道久久综合狠狠爱| 久久国产精品-国产精品| 久久久久亚洲精品日久生情| 国产精品一区二区久久| 久久中文字幕人妻熟av女| 免费观看成人久久网免费观看| 久久久精品久久久久影院| 国产精品热久久无码av| 久久无码人妻一区二区三区午夜 | 久久国产劲爆AV内射—百度| 香港aa三级久久三级| 欧美噜噜久久久XXX| 亚洲国产婷婷香蕉久久久久久| 一本一道久久精品综合| a高清免费毛片久久| 欧美一区二区三区久久综合 | 97久久超碰成人精品网站| 18禁黄久久久AAA片| 久久久久久久综合日本| 一本久久久久久久| 国产高潮久久免费观看| 99久久国产热无码精品免费| 久久人人爽人人人人爽AV| 久久久久99这里有精品10| 久久天天躁狠狠躁夜夜2020| 精品国产91久久久久久久a| 久久国产精品-国产精品| 久久夜色精品国产噜噜噜亚洲AV| 97精品依人久久久大香线蕉97| 国产精品乱码久久久久久软件| 欧美精品福利视频一区二区三区久久久精品 | 人人狠狠综合久久亚洲婷婷| 东京热TOKYO综合久久精品| 精品人妻久久久久久888| 热re99久久6国产精品免费| 久久久久人妻一区精品色| 91久久精品91久久性色|