1. 程式人生 > 其它 >C++類佔用記憶體大小知識總結

C++類佔用記憶體大小知識總結

(3)一個類至少佔用一個位元組大小;

(4)虛擬函式:不管幾個虛擬函式,sizeof()都是多了4個位元組;

(5)類裡只要有一個虛擬函式(或者說至少有一個虛擬函式),這個類會產生一個指向虛擬函式的指標

  有兩個虛擬函式,那麼這個類就會產生兩個指向虛擬函式的的指標。

      虛擬函式表是基於類的,跟著類走,因為有了虛擬函式的存在,導致系統在類中添加了一個指標;

      這個指標正好指向虛擬函式表,這個指標叫做vptr; 這個vptr的值由系統在適當的時機(比如建構函式中通過增加額外的程式碼來給值)

總結:

a:對於類中靜態資料成員不計算在sizeof內;

b:普通的成員函式和靜態成員函式不計算在類的物件的sizeof內

c:虛擬函式不計算在內的sizeof()內,但是虛擬函式會讓類物件增加4位元組的大小,以容納虛擬函式表指標;

d;虛擬函式表[vtbl]是基於類的(跟著類走,跟物件沒關係,不是基於物件的);

e:如果有多個數據成員,那麼為了提高訪問速度,某些編譯器可能將資料成員之間的記憶體佔用比例進行調整;(記憶體資料對齊)

f:不管什麼型別指標 char *p ,int *q;該指標佔用的記憶體大小是固定的;如sizeof(char *)=4,sizeof(int *)=4;在其他平臺可能是8位元組(linux平臺)。

class MyClass
{
public:
    MyClass();
    
~MyClass(); float getValue()const { return m_value; }; static void setcount(int c) { m_count = c; }; virtual void func() {}; protected: int ab; float m_value; static int m_count; private: }; MyClass::MyClass() { } MyClass::~MyClass() { }
using namespace std; //類物件所佔用的空間大小 int main() { // std::cout << "Hello World!\n"; MyClass obja; int size = sizeof(obja ); cout << size << endl; return 1; }

結果:12