欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c++ class中成員與分配內(nèi)存的問題詳解

 更新時(shí)間:2021年10月08日 10:32:13   作者:gonghw403  
很多人都知道C++類是由結(jié)構(gòu)體發(fā)展得來的,所以他們的成員變量(C語言的結(jié)構(gòu)體只有成員變量)的內(nèi)存分配機(jī)制是一樣的,下面這篇文章主要給大家介紹了關(guān)于c++ class中成員與分配內(nèi)存問題的相關(guān)資料,需要的朋友可以參考下

1.內(nèi)存補(bǔ)齊

便于管理類(生成的對(duì)象)的內(nèi)存,類總內(nèi)存總是為最大成員字節(jié)大小的倍數(shù),不足的會(huì)進(jìn)行內(nèi)存補(bǔ)齊

類的整體內(nèi)存就是由n塊最大成員字節(jié)大小的區(qū)域組成的

而內(nèi)存的分配對(duì)于成員變量來說是按照書寫順序來的(也就是構(gòu)造順序)如果不足最大成員大小,就自動(dòng)填充

后一位變量如果無法排在前一位變量的那一塊內(nèi)存里面,就直接再開拓一塊最大成員字節(jié)大小的空間存放自己,前一位的剩余空間自動(dòng)填充

class A{   //sizeof = 8
  int a;
  char b;
  short c;
};

class B{  //sizeof = 12
  char a;
  int b;
  short c;
};

上面類A,B,最大都是int 4字節(jié) :

A類,第一個(gè)是int ,4字節(jié)全部填滿; 第二個(gè)char,1字節(jié),還剩3字節(jié);第三個(gè)short,2字節(jié),補(bǔ)在第二個(gè)空間后,還剩一個(gè)字節(jié)自動(dòng)補(bǔ)齊,一共2*4=8字節(jié)

B類,第一個(gè)是char,1字節(jié),還剩三個(gè)字節(jié);第二個(gè)int,4字節(jié),第一個(gè)剩的空間不夠,直接開拓下一個(gè)4字節(jié),剩下的三字節(jié)自動(dòng)填滿;第三個(gè)short,2字節(jié),還剩2字節(jié)自動(dòng)補(bǔ)齊,一共3*4=12

2.特殊情況--virtual函數(shù)

如果一個(gè)類里面有虛函數(shù),類會(huì)自動(dòng)生成一個(gè)虛函數(shù)表指針,4字節(jié)的來管理虛函數(shù)

一個(gè)類無論有幾個(gè)虛函數(shù)都只有有一個(gè)四字節(jié)的指針

而且這個(gè)指針在其他成員之前生成,也就是和你寫虛函數(shù)的順序無關(guān)

比如:

class A{            //實(shí)際上sizeof = 2*4=8 ,而不是12
  char a;
  virtual void f() {}
  short b;
};

上面等價(jià)于

class A{  
  T *table //虛函數(shù)指針      
  char a;
  short b;
};

按照上面的方法可得sizeof = 8

同樣,由于虛函數(shù)指針是四個(gè)字節(jié),如果成員里面有更高字節(jié)的,同樣內(nèi)存補(bǔ)齊

class A{                //sizeof = 8*2 = 16
  virtual void f() {}    
  double a;
};

3.不需要考慮的內(nèi)存

每個(gè)對(duì)象所占用的存儲(chǔ)空間只是該對(duì)象的數(shù)據(jù)部分(虛函數(shù)指針和虛基類指針也屬于數(shù)據(jù)部分)所占用的存儲(chǔ)空間,而不包括函數(shù)代碼所占用的存儲(chǔ)空間

一些看似成員的要注意不算內(nèi)存

如:

一.靜態(tài)函數(shù)和變量 :

靜態(tài)函數(shù)和變量都不屬于類管理,統(tǒng)一在常量?jī)?nèi)存區(qū)里面

二.非虛函數(shù)的成員函數(shù) :

不是每一個(gè)對(duì)象都會(huì)生成成員函數(shù),類的成員函數(shù)在其他內(nèi)存區(qū),對(duì)象用this指針調(diào)用的成員函數(shù),其地址固定

三.友元函數(shù)和非虛函數(shù)的成員函數(shù)性質(zhì)一樣

總結(jié)

到此這篇關(guān)于c++ class中成員與分配內(nèi)存問題的文章就介紹到這了,更多相關(guān)c++ class成員與分配內(nèi)存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言進(jìn)階數(shù)據(jù)的存儲(chǔ)機(jī)制完整版

    C語言進(jìn)階數(shù)據(jù)的存儲(chǔ)機(jī)制完整版

    這篇文章主要為大家完整的介紹了C語言進(jìn)階數(shù)據(jù)的存儲(chǔ)機(jī)制,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-02-02
  • Visual?Studio中的解決方案中不顯示項(xiàng)目分析

    Visual?Studio中的解決方案中不顯示項(xiàng)目分析

    這篇文章主要為大家介紹了Visual?Studio中的解決方案中不顯示項(xiàng)目問題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • C語言中的long型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)(遇到的坑)

    C語言中的long型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)(遇到的坑)

    小編在復(fù)習(xí)C語言的時(shí)候踩到了不少坑,糾結(jié)long類型究竟占4個(gè)字節(jié)還是8個(gè)字節(jié)呢?好,今天通過本文給大家分享下我的詳細(xì)思路,感興趣的朋友跟隨小編一起看看吧
    2021-11-11
  • C++面向?qū)ο髮?shí)現(xiàn)萬年歷的示例代碼

    C++面向?qū)ο髮?shí)現(xiàn)萬年歷的示例代碼

    本文將通過面向?qū)ο髮?shí)現(xiàn)一個(gè)簡(jiǎn)單的日歷(萬年歷)效果,主要會(huì)有以下幾個(gè)模塊:模型、視圖、控制,感興趣的小伙伴可以動(dòng)手嘗試一下
    2022-06-06
  • 5分鐘內(nèi)了解C語言的指針

    5分鐘內(nèi)了解C語言的指針

    這篇文章主要介紹了5分鐘內(nèi)了解C語言的指針,本文講解了指針、引用和取值、void指針、NULL指針和未初始化指針、指針和數(shù)組等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • C語言位圖算法詳解

    C語言位圖算法詳解

    這篇文章主要介紹了C語言實(shí)現(xiàn)的位圖算法,主要包括了位圖算法的定義與應(yīng)用,對(duì)于C程序算法設(shè)計(jì)的學(xué)習(xí)有一定的借鑒價(jià)值,需要的朋友可以參考下
    2014-09-09
  • C++ std::function詳解

    C++ std::function詳解

    類模版std::function是一種通用的多態(tài)函數(shù)包裝器std::function的實(shí)例可以對(duì)任何可以調(diào)用的目標(biāo)實(shí)體進(jìn)行存儲(chǔ)、復(fù)制、和調(diào)用操作,本文詳細(xì)的介紹一下,感興趣的可以了解一下
    2021-10-10
  • C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解

    C++ 情懷游戲貪吃蛇的實(shí)現(xiàn)流程詳解

    貪吃蛇是曾經(jīng)諾基亞手機(jī)上很經(jīng)典很經(jīng)典的傳統(tǒng)老游戲,80.90后的童年時(shí)不多的游戲之一,跟電腦上的掃雷一樣,下面來從貪吃蛇手機(jī)游戲的前世今生講起
    2021-11-11
  • C/C++獲取主機(jī)網(wǎng)卡MAC地址的三方法

    C/C++獲取主機(jī)網(wǎng)卡MAC地址的三方法

    MAC地址(Media Access Control address),又稱為物理地址或硬件地址,是網(wǎng)絡(luò)適配器(網(wǎng)卡)在制造時(shí)被分配的全球唯一的48位地址,通過獲取MAC地址可以判斷當(dāng)前主機(jī)的唯一性可以與IP地址綁定并實(shí)現(xiàn)網(wǎng)絡(luò)準(zhǔn)入控制,本文給大家介紹了使用C/C++獲取主機(jī)網(wǎng)卡MAC地址的三方法
    2023-11-11
  • C++ Opencv imfill孔洞填充函數(shù)的實(shí)現(xiàn)思路與代碼

    C++ Opencv imfill孔洞填充函數(shù)的實(shí)現(xiàn)思路與代碼

    在Matlab下,使用imfill可以很容易的完成孔洞填充操作,下面這篇文章主要給大家介紹了關(guān)于C++ Opencv imfill孔洞填充函數(shù)的實(shí)現(xiàn)思路與代碼,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-09-09

最新評(píng)論