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

            當(dāng)華美的葉片落盡,生命的脈絡(luò)才歷歷可見。 -- 聶魯達

            常用鏈接

            統(tǒng)計

            積分與排名

            BBS

            Blog

            Web

            最新評論

            sizeof()用法匯總[轉(zhuǎn)]

            轉(zhuǎn)自:http://blog.programfan.com/article.asp?id=19802

            sizeof()功能:計算數(shù)據(jù)空間的字節(jié)數(shù)
            1.與strlen()比較
                  strlen()計算字符數(shù)組的字符數(shù),以"\0"為結(jié)束判斷,不計算為'\0'的數(shù)組元素。
                  而sizeof計算數(shù)據(jù)(包括數(shù)組、變量、類型、結(jié)構(gòu)體等)所占內(nèi)存空間,用字節(jié)數(shù)表示。
            2.指針與靜態(tài)數(shù)組的sizeof操作
                  指針均可看為變量類型的一種。所有指針變量的sizeof 操作結(jié)果均為4。
            注意:int *p; sizeof(p)=4;
                              但sizeof(*p)相當(dāng)于sizeof(int);      
                  對于靜態(tài)數(shù)組,sizeof可直接計算數(shù)組大小;
                  例:int a[10];char b[]="hello";
                          sizeof(a)等于4*10=40;
                          sizeof(b)等于6;
             注意:數(shù)組做型參時,數(shù)組名稱當(dāng)作指針使用!!
                           void  fun(char p[])
                           {sizeof(p)等于4} 
            經(jīng)典問題: 
                  
            double* (*a)[3][6]; 
                  cout
            <<sizeof(a)<<endl; // 4 a為指針
                  cout<<sizeof(*a)<<endl; // 72 *a為一個有3*6個指針元素的數(shù)組
                  cout<<sizeof(**a)<<endl; // 24 **a為數(shù)組一維的6個指針
                  cout<<sizeof(***a)<<endl; // 4 ***a為一維的第一個指針
                  cout<<sizeof(****a)<<endl; // 8 ****a為一個double變量
            問題解析:a是一個很奇怪的定義,他表示一個指向double*[3][6]類型數(shù)組的指針。既然是指針,所以sizeof(a)就是4 
                  
            既然a是執(zhí)行double*[3][6]類型的指針,*a就表示一個double*[3][6]的多維數(shù)組類型,因此sizeof(*a)=3*6*sizeof(double*)=72。同樣的,**a表示一個double*[6]類型的數(shù)組,所以sizeof(**a)=6*sizeof  (double*)=24***a就表示其中的一個元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一個double了,所以sizeof(****a)=sizeof(double)=8

            3.格式的寫法
               sizeof操作符,對變量或?qū)ο罂梢圆患永ㄌ枺羰穷愋停毤永ㄌ枴?br>4.使用sizeof時string的注意事項
               string s="hello";
               sizeof(s)等于string類的大小,sizeof(s.c_str())得到的是與字符串長度。
            5.union 與struct的空間計算
               總體上遵循兩個原則:
               (1)整體空間是
            占用空間最大的成員(的類型)所占字節(jié)數(shù)的整倍數(shù)
               (2)數(shù)據(jù)對齊原則----內(nèi)存按結(jié)構(gòu)成員的先后順序排列,當(dāng)排到該成員變量時,其前面已擺放的空間大小必須是該成員類型大小的整倍數(shù),如果不夠則補齊,以此向后類推。。。。。
               注意:數(shù)組按照單個變量一個一個的擺放,而不是看成整體。如果成員中有自定義的類、結(jié)構(gòu)體,也要注意數(shù)組問題。

            例:[引用其他帖子的內(nèi)容]
            因為對齊問題使結(jié)構(gòu)體的sizeof變得比較復(fù)雜,看下面的例子:(默認(rèn)對齊方式下)
            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類型,但是因為對齊問題,導(dǎo)致他們的大小不同。計算結(jié)構(gòu)體大小可以采用元素擺放法,我舉例子說明一下:首先,CPU判斷結(jié)構(gòu)體的對界,根據(jù)上一節(jié)的結(jié)論,s1s2的對界都取最大的元素類型,也就是double類型的對界8。然后開始擺放每個元素。
             
            對于s1,首先把a放到8的對界,假定是0,此時下一個空閑的地址是1,但是下一個元素ddouble類型,要放到8的對界上,離1最接近的地址是8了,所以d被放在了8,此時下一個空閑地址變成了16,下一個元素c的對界是416可以滿足,所以c放在了16,此時下一個空閑地址變成了20,下一個元素d需要對界1,也正好落在對界上,所以d放在了20,結(jié)構(gòu)體在地址21處結(jié)束。由于s1的大小需要是8的倍數(shù),所以21-23的空間被保留,s1的大小變成了24
             
            對于s2,首先把a放到8的對界,假定是0,此時下一個空閑地址是1,下一個元素的對界也是1,所以b擺放在1,下一個空閑地址變成了2;下一個元素c的對界是4,所以取離2最近的地址4擺放c,下一個空閑地址變成了8,下一個元素d的對界是8,所以d擺放在8,所有元素擺放完畢,結(jié)構(gòu)體在15處結(jié)束,占用總空間為16,正好是8的倍數(shù)。

            這里有個陷阱,對于結(jié)構(gòu)體中的結(jié)構(gòu)體成員,不要認(rèn)為它的對齊方式就是他的大小,看下面的例子:
            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;

              s1s2大小雖然都是8,但是s1的對齊方式是1s28double),所以在s3s4中才有這樣的差異。
             
            所以,在自己定義結(jié)構(gòu)體的時候,如果空間緊張的話,最好考慮對齊因素來排列結(jié)構(gòu)體里的元素。
            補充:不要讓double干擾你的位域
              在結(jié)構(gòu)體和類中,可以使用位域來規(guī)定某個成員所能占用的空間,所以使用位域能在一定程度上節(jié)省結(jié)構(gòu)體占用的空間。不過考慮下面的代碼:
            struct s1
            {
             int i: 8;
             int j: 4;
             double b;
             int a:3;
            };

            struct s2
            {
             int i;
             int j;
             double b;
             int a;
            };

            struct s3
            {
             int i;
             int j;
             int a;
             double b;
            };

            struct s4
            {
             int i: 8;
             int j: 4;
             int a:3;
             double b;
            };

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

              可以看到,有double存在會干涉到位域(sizeof的算法參考上一節(jié)),所以使用位域的的時候,最好把float類型和double類型放在程序的開始或者最后。

            相關(guān)參數(shù):
            sizeof int:4
            sizeof short:2
            sizeof long:4
            sizeof float:4
            sizeof double:8
            sizeof char:1
            sizeof p:4
            sizeof WORD:2
            sizeof DWORD:4

            posted on 2008-01-17 17:54 isabc 閱讀(218) 評論(0)  編輯 收藏 引用 所屬分類: C++基礎(chǔ)

            廣告信息(免費廣告聯(lián)系)

            中文版MSDN:
            歡迎體驗

            久久这里只有精品首页| 7777久久亚洲中文字幕| 久久亚洲国产中v天仙www| 精品一二三区久久aaa片| 区久久AAA片69亚洲| 婷婷久久综合九色综合绿巨人| 国产精品久久久久久久午夜片| 久久精品国产精品亚洲精品| 91久久婷婷国产综合精品青草| 久久精品中文字幕无码绿巨人| 亚洲精品乱码久久久久久| 漂亮人妻被中出中文字幕久久| 奇米影视7777久久精品人人爽| 99精品国产99久久久久久97| 色偷偷偷久久伊人大杳蕉| 久久婷婷五月综合97色一本一本| 色偷偷88888欧美精品久久久 | 亚洲va久久久噜噜噜久久狠狠| 一极黄色视频久久网站| 一本久久免费视频| 伊人久久久AV老熟妇色| 99久久99这里只有免费费精品| 国产精品丝袜久久久久久不卡| 99久久婷婷国产综合精品草原| 激情五月综合综合久久69| 中文成人久久久久影院免费观看 | 亚洲AV伊人久久青青草原| 久久人人爽人人爽人人片AV麻烦| A级毛片无码久久精品免费| 精品少妇人妻av无码久久| 国产成人精品久久亚洲高清不卡 | 午夜精品久久久久久久无码| 无码国产69精品久久久久网站| 欧美综合天天夜夜久久| 一级女性全黄久久生活片免费 | 亚洲欧美日韩久久精品| 久久人人爽爽爽人久久久| 99久久精品免费| 日韩精品久久无码人妻中文字幕| 久久久久一本毛久久久| 精品国产VA久久久久久久冰|