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語言實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲完整代碼
大家好,本篇文章主要講的是C語言實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲完整代碼,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
C++類靜態(tài)成員與類靜態(tài)成員函數(shù)詳解
靜態(tài)成員不可在類體內(nèi)進(jìn)行賦值,因?yàn)樗潜凰性擃惖膶?duì)象所共享的。你在一個(gè)對(duì)象里給它賦值,其他對(duì)象里的該成員也會(huì)發(fā)生變化。為了避免混亂,所以不可在類體內(nèi)進(jìn)行賦值2013-09-09
C語言字符串函數(shù)操作(strlen,strcpy,strcat,strcmp)詳解
大家好,本篇文章主要講的是C語言字符串函數(shù)操作(strlen,strcpy,strcat,strcmp)詳解,感興趣的同學(xué)趕快來看一看吧2021-12-12
C++ std::make_unique和std::make_shared用法小結(jié)
本文主要介紹了C++ std::make_unique和std::make_shared用法,使用std::make_unique和std::make_shared能夠簡(jiǎn)化動(dòng)態(tài)分配內(nèi)存和構(gòu)造對(duì)象的過程,提高代碼的安全性和可讀性,感興趣的可以了解一下2023-11-11

