c++ class中成員與分配內(nèi)存的問題詳解
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++11中的可變參數(shù)模板/lambda表達(dá)式
C++11的新特性可變參數(shù)模板能夠讓我們創(chuàng)建可以接受可變參數(shù)的函數(shù)模板和類模板,相比C++98和C++03,類模板和函數(shù)模板中只能含固定數(shù)量的模板參數(shù),可變參數(shù)模板無疑是一個(gè)巨大的改進(jìn),這篇文章主要介紹了C++11中的可變參數(shù)模板/lambda表達(dá)式,需要的朋友可以參考下2023-03-03
Qt qml實(shí)現(xiàn)動(dòng)態(tài)輪播圖效果
這篇文章主要為大家詳細(xì)介紹了Qt和qml實(shí)現(xiàn)動(dòng)態(tài)輪播圖效果的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考一下2024-12-12
C++回文數(shù)及素?cái)?shù)問題計(jì)算方法
這篇文章主要介紹了C++回文數(shù)及素?cái)?shù)問題計(jì)算方法,可實(shí)現(xiàn)一定范圍內(nèi)的素?cái)?shù)與回文數(shù)運(yùn)算功能,涉及C++字符串遍歷與數(shù)字?jǐn)?shù)學(xué)運(yùn)算的相關(guān)技巧,需要的朋友可以參考下2016-05-05
Ubuntu18.04上安裝Qt5.10的步驟實(shí)踐
Qt是一個(gè)跨平臺(tái)的C++圖形用戶界面庫,本文就介紹了Ubuntu18.04上安裝Qt5.10的步驟實(shí)踐,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11

