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

            Life is Good.

            Enhance Tech and English
            隨筆 - 65, 文章 - 20, 評論 - 21, 引用 - 0
            數(shù)據(jù)加載中……

            C++sizeof使用規(guī)則及陷阱分析

            sizeof()返回的是變量聲明后所占的內(nèi)存數(shù),不是實際長度,此外sizeof不是函數(shù),僅僅是一個操作符.

            cout<<sizeof(int)<<endl; // 32位機上int長度為4

            cout<<sizeof(1==2)<<endl; // == 操作符返回bool類型,相當于 cout<<sizeof(bool)<<endl;

            這里有個陷阱,看下面的程序:

               int a = 0;

              cout<<sizeof(a=3)<<endl;

               cout<<a<<endl;

              輸出為什么是4,0而不是期望中的4,3???就在于sizeof在編譯階段處理的特性。由于sizeof不能被編譯成機器碼,所以sizeof作用范圍內(nèi),也就是()里面的內(nèi)容也不能被編譯,而是被替換成類型。=操作符返回左操作數(shù)的類型,所以a=3相當于int,而代碼也被替換為:

              int a = 0;

              cout<<4<<endl;

              cout<<a<<endl;

            數(shù)組問題

              考慮下面問題:

              char a[] = "abcdef";

              char b[] = {'a', 'b', 'c', 'd', 'e', 'f'};

              int c[20] = {3, 4};

               char d[2][3] = {"aa", "bb"};

               cout<<sizeof(a)<<endl; // 7, 表示字符串

                    cout<<sizeof(b)<<endl; // 6, 僅表示字符數(shù)組

               cout<<sizeof(c)<<endl; // 80

              cout<<sizeof(d)<<endl; // 6

                     cout << sizeof(*a) << endl;//1

               cout << sizeof(*b) << endl;//1

               cout << sizeof(*c) << endl;//4

                cout << sizeof(*d) << endl;//3

            結(jié)論:特別如果字符數(shù)組表示字符串的話,數(shù)組末自動插入的'\0',在sizeof時不能遺漏,數(shù)組a的大小在定義時未指定,編譯時給它分配的空間是按照初始化的值確定的,也就是。c是多維數(shù)組,占用的空間大小是各維數(shù)的乘積,也就是6。可以看出,數(shù)組的大小就是他在編譯時被分配的空間,也就是各維數(shù)的乘積*數(shù)組元素的大小。


            再分析下面的多維數(shù)組問題:

              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

              (一)不考慮繼承關(guān)系(單繼承、多繼承、虛繼承等)

              (1)不帶virtual函數(shù)時

              空類:

              class A

              { };

              cout << sizeof(A) << endl; // 1

              空類總是返回1

              class B {

              private :

              int value;

              double a;

              public:};

              cout << sizeof(B) << endl; //16

              和struct一樣,也要考慮對齊問題,以及成員的順序因為成員函數(shù)不會分配空間,所以sizeof時只計算數(shù)據(jù)成員的大小

              (2)帶virtual函數(shù)時

              單繼承情況下,只要class中存在virtual函數(shù),編譯器在編譯時就會自動插入一個指向虛函數(shù)表的指針vptr(大小為4字節(jié)). 不同的編譯器vptr插入的位置可能不同,VC編譯器插入vptr的位置一般是數(shù)據(jù)成員開始。

              下例在MinGW Develper Studio2.05(gcc)下編譯,VC 6.0編譯器下結(jié)果為24  24, 我不太理解為什么...

               class A

               {

               public:

               virtual void foo() {}

               private:

               int m1;

               double m2;

               };

              class B

               {

               public:

              virtual void foo() {}

               private:

               double m2;

               int m1;

               };

              cout << sizeof(A) << endl; // 24

               cout << sizeof(B) << endl; // 24

                  產(chǎn)生上面的不同時數(shù)據(jù)對其的原因。

            (3)帶static成員時

               class A {

              private :

              int value;

              double a;

              static int CST;

              public:

               };

              cout << sizeof(A) << endl; //16

              因為static成員是分配在全局區(qū)為類的所有對象共享(VC編譯器可能為了方便將其放入文字常量表), sizeof時不應(yīng)該計入static成員

            posted on 2010-10-26 21:53 Mike Song 閱讀(310) 評論(0)  編輯 收藏 引用 所屬分類: C/C++

            久久久国产精品福利免费| 日韩久久无码免费毛片软件| 国产精品视频久久| 久久91这里精品国产2020| 武侠古典久久婷婷狼人伊人| 人妻精品久久无码区| 国产毛片久久久久久国产毛片| 亚洲精品综合久久| 99久久久久| 国产精品女同久久久久电影院 | 久久综合鬼色88久久精品综合自在自线噜噜 | 久久国产精品成人影院| 国产免费福利体检区久久| 久久久无码精品亚洲日韩蜜臀浪潮 | 97久久超碰国产精品2021| 一本大道久久东京热无码AV| 日本道色综合久久影院| 久久国产免费观看精品3| 久久久www免费人成精品| 久久午夜综合久久| 亚洲狠狠久久综合一区77777| 亚洲中文精品久久久久久不卡| 久久无码一区二区三区少妇| 国产精品va久久久久久久| 狠狠色丁香久久综合五月| 久久久久av无码免费网| 一本色道久久综合| 免费久久人人爽人人爽av| 亚洲国产成人精品女人久久久 | 久久久久久夜精品精品免费啦| 久久亚洲国产最新网站| 久久婷婷人人澡人人| 婷婷久久综合| 久久久久久久精品成人热色戒| 伊人久久大香线蕉精品不卡| 伊人精品久久久久7777| 久久免费看黄a级毛片| 伊人久久综合无码成人网| 亚洲va久久久噜噜噜久久天堂| 狼狼综合久久久久综合网| 国产精品久久久久久久久鸭|