亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深入解析C++ Data Member內存布局

2020-01-26 16:00:38
字體:
來源:轉載
供稿:網友

如果一個類只定義了類名,沒定義任何方法和字段,如class A{};那么class A的每個實例占用1個字節的內存,編譯器會會在這個其實例中安插一個char,以保證每個A實例在內存中有唯一的地址,如A a,b;&a!=&b。如果一個直接或是間接的繼承(不是虛繼承)了多個類,如果這個類及其父類像A一樣沒有方法沒有字段,那么這個類的每個實例的大小都是1字節,如果有虛繼承,那就不是1字節了,每虛繼承一個類,這個類的實例就會多一個指向被虛繼承父類的指針。還有一點值得說明的就是像A這樣的類,編譯器不一定會產生傳說中的那6個方法,這些方法只會在需要的時候產生,如class  A沒有被任何地方使用那這些方法編譯器就沒有必要產生,如果這個類實例化了,那么會產生default constructor,而destructor則不一定產生。

如果一個類中有static data member,nonstatic data member,還有const data member,enum,那么它的內存布局會是什么樣的呢,看下面簡單的類Point:

復制代碼 代碼如下:

class Point
{
public:
    Point():maxCount(10){}
private:
    int X;
    static int count;
    int Y;
    const int maxCount ;
    enum{
        minCount=2
    };
};

Sizeof(Point)=12,為什么占12字節呢,我相信很多人都知道是哪幾個成員變量占用的,就是X,Y,maxCount,maxCount作為常量字段,但在Point的每個實例中可能有不同的值,當然屬于Point實例的一部分,如果把maxCount定義成static,那它就不不是Point實例的一部分了,如果定義成static  const int maxCount=1;則maxCount分配在.data段中,如果沒有初始化則分配在.bss段中,反正跟Point的實例無關,count分配在.bss段中,minCount分配在.rdata段中,總之count,maxCount,minCount在編譯連接完成之后,內存(虛擬地址)就分配好了,在程序加載的時候,會把他們的虛擬地址對應上實際的物理地址。

Data member的內存布局:nonstatic data member在class object中的順序和其申明的順序一樣,static data  member和const member不在class object中因為他們只有一份,被class object共享,所以static data member和const data member,枚舉并不會響應class object的大小。關于段的信息,我覺得是每個C/C++程序員必須知道的。而Point每次實例化的時候則只需要分配X,Y,maxCount需要的內存。

每個類的data member在內存中應該是連續的,如果出現數據對齊的情況,可能中間會有空白地帶。請看下面幾個類:

復制代碼 代碼如下:

class AA
{
protected:
    int X;
    char a;
};

class BB:public AA
{
protected:
    char b;
};

class CC:public BB
{
protected:
    char c;
};


Sizeof(AA)=8//對齊3字節
Sizeof(BB)=12//兩個3字節對齊
Sizeof(CC)=16//編譯器“無恥”的用了3個3字節對齊



編譯器為什么要無恥的在class CC中加3個3字節對齊呢,這樣每個CC的實例就大了9字節。如果編譯器不加這9字節的空白,那么CC的每個實例就是8字節,前面的X占4字節,后面的a,b,c占3字節,加1字節的空白對齊,剛好8字節,沒有誰很傻很天真的以為最好是占7字節吧。

如果CC占用8字節內存,同樣的AA,BB都是8字節的內存,這樣的話,如果把一個指向AA實例的指針賦給一個指向CC實例的指針,那么就會把AA中的8字節直接蓋到CC的8字節上,結果CC實例中的b,c都被賦上了不是我們想要的值,這很可能會導致你的程序出問題。

父類的data member會在子類的實例中有完整的一份,這樣在有繼承關系的類之間進行類型轉換,就只用簡單的修改指針的指向。

Data Member的存取。對一個data member的存取,編譯器把對象實例的起始地址加上data member的偏移量。如CC c;

c.X=1;相當于&c+(&CC::X-1),減一其實是為了區分是指向object的指針還是指向data member的指針,指向data member的要減一。每一個data member的偏移量在編譯的時候是知道的,根據成員變量的類型和內存對齊,存在virtual繼承或是虛方法的情況編譯器會自動加上一些輔助的指針,如指向虛方法的指針,指向虛繼承父類的指針等。

在data member的存取效率上,struct member 、class member、單一繼承或是多重繼承的情況下效率都是一樣的,因為他們的存儲其實都是&obj+(&class.datamember-1)。在虛繼承的情況下,可能會影響存儲性能,如通過一個指針來存取一個指向虛繼承而來的data member,那么性能會有影響,因為在虛繼承的時候,在編譯的時候還不能確定這個data member是來自子類還是父類,只有在運行的時候才能推斷出來,其實就是多了一步指針的操作,在虛繼承中,如果是通過對象實例來操作虛繼承而來的data member,則不會有任何性能問題,因為不存在什么多態性,所有東西在編譯的時候內存地址都確定了。

虛繼承還是虛方法為了實現多態一樣,多了一步,如果不需要多態,而是通過對象實例調用相關的方法就不會有性能問題。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩精品在线第一页| 国产精品亚洲激情| 国产精品久久久久久久久久久不卡| 欧美大尺度激情区在线播放| 成人免费福利视频| 欧美整片在线观看| 色偷偷91综合久久噜噜| 97在线免费观看| 亚洲欧洲av一区二区| 欧美肥老妇视频| 亚洲风情亚aⅴ在线发布| 欧美午夜精品伦理| 日韩电影中文字幕在线| 国产日韩换脸av一区在线观看| 日韩精品在线视频观看| 成人国产亚洲精品a区天堂华泰| 欧美午夜电影在线| 在线观看精品自拍私拍| 国产精品精品视频一区二区三区| 中文字幕精品—区二区| 精品少妇v888av| 欧美亚洲成人免费| 亚洲国产欧美自拍| 亚洲国产小视频| 日韩极品精品视频免费观看| 中文字幕精品久久| 国产精品丝袜视频| 国产成人精品优优av| 欧美大胆a视频| 98精品在线视频| 国产脚交av在线一区二区| 国产精品第一页在线| www.亚洲一二| 97在线看福利| 中文字幕日韩在线播放| 国产精品激情av在线播放| 午夜精品国产精品大乳美女| 国产精品99久久久久久久久久久久| 亚洲男人第一av网站| 久久久久久亚洲精品| 精品在线欧美视频| 黑人巨大精品欧美一区免费视频| 在线播放日韩av| 久久亚洲一区二区三区四区五区高| 久久91精品国产91久久久| 亚洲a一级视频| 成人有码在线视频| 欧美日韩精品在线| 国产成人+综合亚洲+天堂| 91免费的视频在线播放| 国产精品久久久久久婷婷天堂| 亚洲夜晚福利在线观看| 午夜精品一区二区三区在线视频| 成人写真视频福利网| 亚洲一区二区三区乱码aⅴ蜜桃女| 8090成年在线看片午夜| 91成人免费观看网站| 亚洲欧美日韩直播| 欧美老女人xx| 亚洲精品aⅴ中文字幕乱码| 欧美视频裸体精品| 美女福利精品视频| 欧美一性一乱一交一视频| 亚洲欧美中文日韩在线| 久久综合国产精品台湾中文娱乐网| 精品福利在线看| 亚洲电影免费观看高清完整版| 91地址最新发布| xxav国产精品美女主播| 日本精品va在线观看| 日韩在线观看免费| 国产丝袜精品第一页| 亚洲理论在线a中文字幕| 98视频在线噜噜噜国产| 国产精品亚洲美女av网站| 久久黄色av网站| 中文字幕欧美日韩| 欧美激情免费视频| 狠狠躁18三区二区一区| 91av免费观看91av精品在线| 91极品视频在线| 狠狠色狠色综合曰曰| 51视频国产精品一区二区| 成人黄色在线观看| 日韩精品中文在线观看| 法国裸体一区二区| 亚洲va国产va天堂va久久| 欧美性xxxxxx| 欧美极品在线视频| 国产成人小视频在线观看| 亚洲黄色在线观看| 久久久久久亚洲| 欧美久久精品午夜青青大伊人| 亚洲欧美一区二区三区久久| 国产精品爱啪在线线免费观看| 亚洲九九九在线观看| 欧美激情视频在线观看| 自拍偷拍亚洲欧美| 51ⅴ精品国产91久久久久久| 人妖精品videosex性欧美| 欧美激情精品久久久久久变态| 成人国产精品日本在线| 亚洲电影免费观看高清完整版在线| 中文字幕精品国产| 欧美激情在线狂野欧美精品| 欧美黄色片视频| 77777亚洲午夜久久多人| 国内成人精品视频| 欧美激情女人20p| 97视频色精品| 亚洲美女在线视频| 91po在线观看91精品国产性色| 国产精品午夜国产小视频| 欧美日韩在线第一页| 日韩在线一区二区三区免费视频| 国产亚洲美女精品久久久| 日韩专区在线观看| 在线播放日韩欧美| 亚洲国模精品一区| 91久久精品久久国产性色也91| 欧美日韩一区二区在线播放| 中文字幕在线看视频国产欧美在线看完整| 欧美小视频在线观看| 最近2019年好看中文字幕视频| 性日韩欧美在线视频| 欧美中文字幕精品| 欧美日韩国产一区中文午夜| 成人免费网站在线看| 亚洲国产成人91精品| 91精品国产高清自在线看超| 91久久精品美女| 日韩电影在线观看永久视频免费网站| 51精品在线观看| 精品久久久久久久久久ntr影视| 91高清免费在线观看| 色一情一乱一区二区| 91在线观看免费高清| 高清一区二区三区四区五区| 国内免费久久久久久久久久久| 91免费精品视频| 国产一区二区动漫| 亚洲乱码一区二区| 在线电影av不卡网址| 国产日韩精品电影| 国产在线精品一区免费香蕉| 精品中文字幕在线2019| 精品国模在线视频| 神马国产精品影院av| 精品久久久久久中文字幕一区奶水| 国产精品极品尤物在线观看| 国产一区私人高清影院| 欧美日韩亚洲一区二区三区| 97在线免费观看视频| 欧美视频中文字幕在线| 精品国产依人香蕉在线精品| 国产精品久久国产精品99gif| 亚洲一区二区三区毛片| 亚洲最新av在线| 欧美国产日韩免费| 亚洲一区二区久久久久久| 粗暴蹂躏中文一区二区三区| 国产精品自拍小视频| 国产美女主播一区| 久久久亚洲欧洲日产国码aⅴ|