一直有這樣幾個疑問,C++中一個對象占有多大內存?會不是裡面的函數越多,占有的內存就越大?
1:空類占有的內存
#pragma once
class TestClass
{
};
結果:sizeof(TestClass) = 1
原因:C++要為每一個類在內存中一個獨一無二的地址,所以即便是空類也會被分配1個字節來初
始化,所以空類的占有的字節是1.
結論:空類也要占用一個字節的內存
2:函數占有內對象的內存嗎?
#pragma once
class TestClass
{
public:
TestClass(void);
~TestClass(void);
void func();
};
sizeof(TestClass) = 1
原因:我們在進行成員函數的調用如Object.func(),其實是這樣的過程--func(Object.this)。函數雖然在內
部聲明,但是成員函數的大小不在類的對象裡面,而是多個成員對象公用函數,“我們訪問類的成員函數是
通過類裡面的一個指針實現,而這個指針指向的是一個table,table裡面記錄的各個成員函數的地址(當然
不同的編譯可能略有不同的實現)”(引號裡面的話為copy網上的,感覺還是有點問題的,如果類裡面有這
樣一個指針,豈不是會至少占用四個字節,那麼就不會出現空類的大小是1了,應該是直接把Object.func()
翻譯成 TestClass::func(Object.this) ).
3:僅有數據成員
#pragma once
class TestClass
{
private:
int b;
};
sizeof(TestClass) = 4
此時類的大小就是其中數據成員的大小
4:字節對齊
#pragma once
class TestClass
{
public:
TestClass(void);
~TestClass(void);
private:
char c;
int b;
};
結果:sizeof(TestClass) = 8
原因:char類型只有1個字節,但是為了提高cpu的計算速度,編譯器會將1個字節補成4個字節
5:當有靜態變量時候
#pragma once
class TestClass
{
public:
TestClass(void);
~TestClass(void);
private:
char c;
int b;
static int m;
};
結果:sizeof(TestClass) = 8
原因:靜態變量不占用類對象的內存
6:當有虛函數
#pragma once
class TestClass
{
public:
TestClass(void);
virtual ~TestClass(void);
private:
char c;
int b;
};
結果:sizeof(TestClass) = 12
原因:此時類對象內部有一個指向虛函數表的指針,這個指針會占用4個字節的內存。
參考資料:
http://www.tuicool.com/articles/uiUJry