• <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>
            Welcome to Leon's Blog  
            日歷
            <2008年10月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678
            統計
            • 隨筆 - 30
            • 文章 - 0
            • 評論 - 51
            • 引用 - 0

            導航

            常用鏈接

            留言簿(4)

            隨筆分類

            隨筆檔案

            ACM

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

             
            sizeof()功能:計算數據空間的字節數
            1.與strlen()比較
                  strlen()計算字符數組的字符數,以"\0"為結束判斷。
                  而sizeof計算數據(包括數組、變量、類型、結構體等)所占內存空間,用字節數表示
            2.指針與靜態數組的sizeof操作
                  指針均可看為變量類型的一種。所有指針變量的sizeof 操作結果均為4。
                  注意:int *p; sizeof(p)=4;
                               但sizeof(*p)相當于sizeof(int);      
                  對于靜態數組,sizeof可直接計算數組大小;
                  例:int a[10];char b[]="hello";
                          sizeof(a)等于10;
                          sizeof(b)等于7;
                  注意:數組做型參時,數組名稱當作指針使用!!
                           void  fun(char p[])
                           {sizeof(p)等于4}
                
              經典問題: 

                  double* (*a)[3][6]; 

                  cout<<sizeof(a)<<endl; // 4 
                  cout<<sizeof(*a)<<endl; // 72 
                  cout<<sizeof(**a)<<endl; // 24 
                  cout<<sizeof(***a)<<endl; // 4 
                  cout<<sizeof(****a)<<endl; // 8 

                  a
            是一個很奇怪的定義,他表示一個指向double*[3][6]類型數組的指針。既然是指針,所以sizeof(a)就是4 

                  
            既然a是執行double*[3][6]類型的指針,*a就表示一個double*[3][6]的多維數組類型,因此sizeof(*a)
                 =3*6*sizeof(double*)=72
            。同樣的,**a表示一個double*[6]類型的數組,所以sizeof(**a)=6*sizeof  (double*)=24***a就表示其中的一個元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一個double了,所以sizeof(****a)=sizeof(double)=8
             

            3.格式的寫法
               sizeof操作符,對變量或對象可以不加括號,但若是類型,須加括號
            4
            .使用sizeof時string的注意事項
               string s="hello";
               sizeof(s)等于string類的大小,sizeof(s.c_str())得到的是與字符串長度。
            5.union 與struct的空間計算
               總體上遵循兩個原則:
               (1)整體空間是
            占用空間最大的成員(的類型)所占字節數的整倍數
               (2)數據對齊原則----內存按結構成員的 先后順序排列,當排到該成員變量時,其前面已擺放的空間大小必須是該成員類型大小的整倍數,如果不夠則補齊,以此向后類推。。。。。
               注意:數組按照單個變量一個一個的擺放,而不是看成整體。如果成員中有自定義的類、結構體,也要注意數組問題。
            例:[引用其他帖子的內容]
            因為對齊問題使結構體的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 2008-10-27 22:10 Leon916 閱讀(267) 評論(0)  編輯 收藏 引用 所屬分類: c++學習
             
            Copyright © Leon916 Powered by: 博客園 模板提供:滬江博客
            99久久香蕉国产线看观香| 久久WWW免费人成—看片| 久久免费看黄a级毛片| 久久久一本精品99久久精品88| 看久久久久久a级毛片| 蜜桃麻豆www久久| 久久受www免费人成_看片中文| 婷婷五月深深久久精品| 久久综合九色综合精品| 18岁日韩内射颜射午夜久久成人| 国产午夜精品久久久久免费视 | 精品久久人人爽天天玩人人妻| 久久久久亚洲AV无码观看| 一级做a爰片久久毛片人呢| 热久久最新网站获取| 亚洲国产精品久久久久久| 亚洲精品乱码久久久久久蜜桃图片 | 精品久久久久香蕉网| 亚洲精品美女久久久久99小说 | 香蕉99久久国产综合精品宅男自| 色婷婷久久综合中文久久蜜桃av | 国产精品永久久久久久久久久 | 精品熟女少妇aⅴ免费久久| 亚洲精品乱码久久久久久| 久久综合亚洲色HEZYO国产| 国产成人综合久久精品尤物| …久久精品99久久香蕉国产| 一本色道久久99一综合| 亚洲精品97久久中文字幕无码| 色噜噜狠狠先锋影音久久| 国内精品久久久久影院日本| 亚洲欧美日韩久久精品第一区| 欧美麻豆久久久久久中文| 久久久受www免费人成| 国产成人久久久精品二区三区| 亚洲国产精品一区二区久久| 国产三级久久久精品麻豆三级| 国产精品禁18久久久夂久| 大伊人青草狠狠久久| 久久久久国产精品| 国产午夜精品理论片久久|