C++用new與不用new建立對象的區別

C++建立對象

1、Alignment問題

從新發現這個問題是由於在體系結構課上提到的一個概念,alignment對齊的概念。c++

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補足。this

2.1 虛函數引發的空間佔用:虛函數管理

此外,普通成員函數不會佔用對象空間的大小,也不會影響sizeof的結果。指針

而若是是虛函數就會佔用空間了。code

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 一些有趣的現象

  1. 空類的sizeof爲1
  2. 只有一個char的類的大小爲1
  3. 當有一個爲char,另外一個是虛函數或者int類型成員變量,會出現對齊現象,大小爲8。對齊現象頗有意思,它的規則是:以最長的變量長度爲對齊長度
class MyClass {
public :
    char c; // 1 byte
    long long t;
};

long long爲8 byte,因此總共佔用16 byte。編譯器

在分析完各類狀況以後,只有第一個的結果顯得特別詭異,爲何空類的大小不是0,而是1?編譯

每一個類的實例,在內存中都有一個獨一無二的地址,爲了達到這個目的,編譯器每每會給一個空類隱含的加一個字節,這樣空類在實例化後在內存獲得了獨一無二的地址。------《深度探索c++對象模型》

2、用new與不用new建立對象的區別

內存分配有三種方式:

  1. 從靜態存儲區域分配,內存在編譯期間就已經分配好,這塊內存在整個運行期間都存在,例如static變量。
  2. 從棧上建立:函數內局部變量,自動分配與回收,效率高,可是分配的內存量有限。
  3. 從堆上建立:由程序員控制,malloc、new,free、delete。
相關文章
相關標籤/搜索