C++中的類的大小詳解
一、普通類的大小
#include<iostream> using namespace std; class MyClass { public: MyClass(){ int i = 0; float f = 0.01f; }; int getI(){ return i; } int getF(){ return f; } private: int i; float f; //靜態(tài)變量實(shí)際上是其全局變量,它存儲(chǔ)在全局/靜態(tài)存儲(chǔ)區(qū),不占對(duì)象空間 static int staNum; }; int MyClass::staNum = 2; int main() { MyClass myclass; cout << "myclass的大小" << sizeof(myclass) << endl; return 0; }
我們可以看到,在創(chuàng)建類的對(duì)象中,真正占據(jù)棧空間的只有兩個(gè)成員變量,分別為4個(gè)字節(jié)。靜態(tài)成員變量實(shí)際上與全局變量一起存儲(chǔ)在全局存儲(chǔ)區(qū),而成員函數(shù)則與其他函數(shù)一樣存在于代碼區(qū)。
二、空類的大小
#include<iostream> using namespace std; class MyClass { public: MyClass(){}; private: }; int main() { MyClass myclass; cout << "myclass的大小" << sizeof(myclass) << endl; return 0; }
在使用類的指針的時(shí)候,如果類的的大小為0,那么排在一起的幾個(gè)空類地址都是一樣的話,我們又怎么知道是哪個(gè)呢?
三、自動(dòng)填充類或者結(jié)構(gòu)體的大小
#include<iostream> using namespace std; struct MyStruct1 { bool b1; bool b2; int i1; }; struct MyStruct2 { bool b1; int i1; bool b2; }; struct MyStruct3 { bool b1; short s1; }; int main() { MyStruct1 s1; MyStruct2 s2; MyStruct3 s3; cout << "MyStruct1的大小" << sizeof(s1) << endl; cout << "MyStruct2的大小" << sizeof(s2) << endl; cout << "MyStruct3的大小" << sizeof(s3) << endl; return 0; }
當(dāng)我們按照不同的的順序排列變量的時(shí)候會(huì)發(fā)現(xiàn),類的大小是不盡相同的。第一種情況,MyStruct中的兩個(gè)布爾連在一起,如果后面沒有變量,編譯器會(huì)自動(dòng)填充2個(gè)字節(jié);而現(xiàn)在后面還有一個(gè)整形i,整形跨越了兩個(gè)4字節(jié),在讀取整形的時(shí)候需要兩個(gè)4字節(jié),因此編譯器會(huì)在這種情況下也會(huì)在i1填充2個(gè)字節(jié),從而是i1在下一個(gè)字節(jié)開始。對(duì)于第二種情況,MyStruct2中由于兩個(gè)布爾類型被整形隔開,我們需要兩次填充。第三種情況,MyStruct3中由于short只有兩個(gè)字節(jié),因此只需要填充一個(gè)字節(jié)。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++&&Opencv實(shí)現(xiàn)控制臺(tái)字符動(dòng)畫的方法
這篇文章主要介紹了C++&&Opencv實(shí)現(xiàn)控制臺(tái)字符動(dòng)畫的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07C++智能指針shared_ptr與weak_ptr的實(shí)現(xiàn)分析
shared_ptr是一個(gè)標(biāo)準(zhǔn)的共享所有權(quán)的智能指針,允許多個(gè)指針指向同一個(gè)對(duì)象,定義在 memory 文件中,命名空間為 std,這篇文章主要介紹了C++ 中 shared_ptr weak_ptr,需要的朋友可以參考下2022-09-09C 語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 web 服務(wù)器的原理解析
這篇文章主要介紹了C 語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 web 服務(wù)器的原理解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11基于c++ ege圖形庫實(shí)現(xiàn)五子棋游戲
這篇文章主要為大家詳細(xì)介紹了基于c++ ege圖形庫實(shí)現(xiàn)五子棋游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12