您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何理解c++ class中成員與分配內存的問題”,在日常操作中,相信很多人在如何理解c++ class中成員與分配內存的問題問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何理解c++ class中成員與分配內存的問題”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
1.內存補齊
2.特殊情況--virtual函數
3.不需要考慮的內存
總結
便于管理類(生成的對象)的內存,類總內存總是為最大成員字節大小的倍數,不足的會進行內存補齊
類的整體內存就是由n塊最大成員字節大小的區域組成的
而內存的分配對于成員變量來說是按照書寫順序來的(也就是構造順序)如果不足最大成員大小,就自動填充
后一位變量如果無法排在前一位變量的那一塊內存里面,就直接再開拓一塊最大成員字節大小的空間存放自己,前一位的剩余空間自動填充
class A{ //sizeof = 8 int a; char b; short c; }; class B{ //sizeof = 12 char a; int b; short c; };
上面類A,B,最大都是int 4字節 :
A類,第一個是int ,4字節全部填滿; 第二個char,1字節,還剩3字節;第三個short,2字節,補在第二個空間后,還剩一個字節自動補齊,一共2*4=8字節
B類,第一個是char,1字節,還剩三個字節;第二個int,4字節,第一個剩的空間不夠,直接開拓下一個4字節,剩下的三字節自動填滿;第三個short,2字節,還剩2字節自動補齊,一共3*4=12
如果一個類里面有虛函數,類會自動生成一個虛函數表指針,4字節的來管理虛函數
一個類無論有幾個虛函數都只有有一個四字節的指針
而且這個指針在其他成員之前生成,也就是和你寫虛函數的順序無關
比如:
class A{ //實際上sizeof = 2*4=8 ,而不是12 char a; virtual void f() {} short b; };
上面等價于
class A{ T *table //虛函數指針 char a; short b; };
按照上面的方法可得sizeof = 8
同樣,由于虛函數指針是四個字節,如果成員里面有更高字節的,同樣內存補齊
class A{ //sizeof = 8*2 = 16 virtual void f() {} double a; };
每個對象所占用的存儲空間只是該對象的數據部分(虛函數指針和虛基類指針也屬于數據部分)所占用的存儲空間,而不包括函數代碼所占用的存儲空間
一些看似成員的要注意不算內存
如:
一.靜態函數和變量 :
靜態函數和變量都不屬于類管理,統一在常量內存區里面
二.非虛函數的成員函數 :
不是每一個對象都會生成成員函數,類的成員函數在其他內存區,對象用this指針調用的成員函數,其地址固定
三.友元函數和非虛函數的成員函數性質一樣
到此,關于“如何理解c++ class中成員與分配內存的問題”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。