C++創建物件
一、Alignment問題
重新發現這個問題是因為在體系結構課上提到的一個概念,alignment對齊的概念,
class MyClass {
public :
char c; // 1 byte
int i; // 4 byte
};
像上面這個C++的類,它有兩個變數,
MyClass myclass;
cout << sizeof(myclass) << endl;
或者直接算它的大小
cout << sizeof(MyClass) << endl;
然后按照道理,myclass的大小,應該是5 byte才對,可是最后輸出的結果是8,顯然這就說明系統在創建物件的時候,將物件的變數進行了對齊操作,不足4 byte的按照4 byte補足,
2.1 虛函式引起的空間占用:虛函式管理
此外,普通成員函式不會占用物件空間的大小,也不會影響sizeof的結果,
而如果是虛函式就會占用空間了,
class MyClass {
public :
char c; // 1 byte
int i; // 4 byte
void func();
virtual void func2() //4 byte
{}
};
結果是占用12 byte的大小,
這種的差別是由于c++的類所有的虛函式都是由一個虛函式指標所管理,它的虛函式被放在別的記憶體空間中管理,而普通函式是由this指標所管理,this指標并不是物件本身的一部分,所以不會影響到sizeof的結果,
2.2 一些有趣的現象
- 空類的sizeof為1
- 只有一個char的類的大小為1
- 當有一個為char,另一個是虛函式或者int型別成員變數,會出現對齊現象,大小為8,對齊現象很有意思,它的規則是:以最長的變數長度為對齊長度,
class MyClass {
public :
char c; // 1 byte
long long t;
};
long long為8 byte,所以總共占用16 byte,
在分析完各種情況之后,只有第一個的結果顯得特別詭異,為什么空類的大小不是0,而是1?
每個類的實體,在記憶體中都有一個獨一無二的地址,為了達到這個目的,編譯器往往會給一個空類隱含的加一個位元組,這樣空類在實體化后在記憶體得到了獨一無二的地址,------《深度探索c++物件模型》
二、用new與不用new創建物件的區別
記憶體分配有三種方式:
- 從靜態存盤區域分配,記憶體在編譯期間就已經分配好,這塊記憶體在整個運行期間都存在,例如static變數,
- 從堆疊上創建:函式內區域變數,自動分配與回收,效率高,但是分配的記憶體量有限,
- 從堆上創建:由程式員控制,malloc、new,free、delete,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/98163.html
標籤:C++
上一篇:PAT甲級1006水題飄過
