国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 深入解析C++ Data Member內存布局

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

2020-12-16 14:42C++教程網 C/C++

本篇文章是對C++中的Data Member內存布局進行了詳細的分析介紹,需要的朋友參考下

如果一個類只定義了類名,沒定義任何方法和字段,如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字節對齊

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

編譯器為什么要無恥的在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,則不會有任何性能問題,因為不存在什么多態性,所有東西在編譯的時候內存地址都確定了。

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

延伸 · 閱讀

精彩推薦
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 免费观看在线午夜影视 | 国产亚洲精品久久久闺蜜 | 午夜成人免费视频 | 久久精品国产99精品国产亚洲性色 | 日韩av在线免费 | 91av在| 亚洲欧美一区二区三区情侣bbw | 亚洲国产成人在线 | 高清一区二区三区 | 色交视频| 精品国产乱码久久久久久88av | www.色.com| 欧美a级片在线观看 | 久久99精品久久久久蜜臀 | 国产成人亚洲精品 | 亚洲高清色综合 | 日日骚视频 | www.国产一区 | 欧美黄色影院 | 狠狠爱亚洲| 久久成人国产精品 | 亚洲一区免费观看 | 日韩免费av一区二区 | 中文字幕一区二区三区在线视频 | 欧美国产日韩在线 | 国产乱码久久久久久一区二区 | 男人天堂社区 | 欧美成人精品一区二区男人看 | 成人在线小视频 | 中文字幕日韩欧美 | 国产精品网站在线观看 | 久草中文在线 | 99热精品在线 | 精品国产一区二区三区日日嗨 | 毛片在线网址 | 日本在线观看一区二区 | 国产精品无码久久久久 | 北条麻妃在线一区二区三区 | 欧美日韩国产在线播放 | 波多野结衣一二三四区 | 亚洲免费观看在线视频 |