C++類和結構體內存佔用方式相同
類的內存佔用規則
(1)空類大小爲1,因爲C++標準規定空類也可以實例化,每個實例在內存中都有一個獨一無二的地址,爲了達到這個目的,編譯器往往會給一個空類隱含的加一個字節,這樣空類在實例化後在內存得到了獨一無二的地址;
(2)類的大小爲非靜態成員數據的類型大小之和,靜態成員存放在全局數據段,不影響類實例化的大小;
(3)類本身的一些特性佔用的大小,虛函數表就佔用4個字節,當類中含有虛函數時,無論是否是繼承來的,無論數量,那麼都會產生一個4字節的指針指向虛函數表;
(4)爲優化存取,會產生字節對其問題;
(5)類的成員函數不會佔用空間。
驗證程序
#include <string>
#include <iostream>
//該類大小爲1,得出:空類大小爲1
class CClassA
{
};
//該類大小爲1,得出:即使沒有使用使用默認構造和析構函數,空類大小也爲1
class CClassB
{
public:
CClassB()
{
}
~CClassB()
{
}
};
//該類大小爲4,得出:虛函數表就佔用4個字節
class CClassC
{
public:
CClassC()
{
}
virtual ~CClassC()
{
}
};
//該類大小爲8,和上面一個類比較得出:成員變量佔用類的內存
class CClassD
{
public:
CClassD()
{
}
virtual ~CClassD()
{
}
int m_intA;
};
//該類大小爲4,和上面一個類比較得出:靜態成員存放在靜態存儲區,不影響類的大小
class CClassE
{
public:
CClassE()
{
}
virtual ~CClassE()
{
}
static int m_intA;
};
//該類大小爲8,和CClassD比較得出:成員函數不佔用類的內存
class CClassF
{
public:
CClassF()
{
}
virtual ~CClassF()
{
}
int m_intA;
void TestA()
{
int i = 0;
++i;
}
};
//該類大小爲12,和上面一個類比較得出:爲優化存取,會產生字節對其問題
class CClassG
{
public:
CClassG()
{
}
virtual ~CClassG()
{
}
int m_intA;
char m_char;
void TestA()
{
int i = 0;
++i;
}
};
int main(int argc, char **argv)
{
std::cout << "CClassA的大小:" << sizeof(CClassA) << std::endl;
std::cout << "CClassB的大小:" << sizeof(CClassB) << std::endl;
std::cout << "CClassC的大小:" << sizeof(CClassC) << std::endl;
std::cout << "CClassD的大小:" << sizeof(CClassD) << std::endl;
std::cout << "CClassE的大小:" << sizeof(CClassE) << std::endl;
std::cout << "CClassF的大小:" << sizeof(CClassF) << std::endl;
std::cout << "CClassG的大小:" << sizeof(CClassG) << std::endl;
system("pause");
return 0;
}
程序運行結果: