程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++ 對象占用內存大小的思考

C++ 對象占用內存大小的思考

編輯:C++入門知識

一直有這樣幾個疑問,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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved