溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發(fā)布時間:2021-10-08 11:30:39 來源:億速云 閱讀:148 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“如何理解c++ class中成員與分配內(nèi)存的問題”,在日常操作中,相信很多人在如何理解c++ class中成員與分配內(nèi)存的問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解c++ class中成員與分配內(nèi)存的問題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

目錄
  • 1.內(nèi)存補齊

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

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

  • 總結(jié)

1.內(nèi)存補齊

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

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

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

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

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類,第一個是int ,4字節(jié)全部填滿; 第二個char,1字節(jié),還剩3字節(jié);第三個short,2字節(jié),補在第二個空間后,還剩一個字節(jié)自動補齊,一共2*4=8字節(jié)

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

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

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

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

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

比如:

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

上面等價于

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

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

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

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

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

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

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

如:

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

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

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

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

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

到此,關(guān)于“如何理解c++ class中成員與分配內(nèi)存的問題”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI