2016-01-28 92 views
1

我很清楚爲C++中的struct動態分配內存。dynamiclly爲類分配內存

struct Node 
{ 
    int item; 
    struct Node *next; 
}; 

int main() 
{ 
    struct Node *head = new struct Node; 
    return 0; 
} 

這是一張圖片。

enter image description here

有在堆上分配8字節的存儲器,頭是一個指向它的指針。

但是,當我遇到dynamiclly爲班級分配內存時,有幾個問題困擾了我很長一段時間。有一個例子:

class Example 
{ 
private: 
    int a; 
    double b; 
public: 
    virtual void fun(); 
    void fun2(); 
}; 

int main() 
{ 
    Example *e = new Example; 
} 

void Example::fun() 
{ 
} 

我的問題是:

1.I知道系統爲int和double在堆中分配內存,對系統做也分配爲樂趣內存()和FUN2()堆?如果沒有,fun()和 fun2()存儲在應用程序內存中的哪裏?

2.在堆中分配了多少字節?

3.指針e如何解引用函數fun()或fun2()?

4.取消引用普通函數和取消引用虛擬函數有什麼區別?

+0

FYI:'結構節點* X;'是C,C++中它的'節點* X;',除非你真的想該結構的向前聲明。你也不要寫'class example * e;'或'enum example e;'。 –

+0

'fun()'和'func2()'只是程序的文本段中加載的指令塊(編譯後) –

+0

它們的大小(即函數)是未知的,並且完全實現定義 –

回答

2

首先,一個classstruct是在C++當量,唯一的區別是,默認的訪問改性劑是public一個結構和private一類。而struct Node的數據類型只是Node,所以Node *head = new Node;已經足夠了,無需在任何地方重複struct

1.I知道系統在堆爲int和double分配內存,執行系統還配備了樂趣()和FUN2()的堆內存?如果不是,fun()和fun2()存儲在應用程序內存中的哪裏?

該方法與所有其他功能一起駐留在代碼 -block中。只有一個該方法源代碼的副本,而不是每個實例的副本。

2.在堆中分配了多少字節?

這取決於填充和對齊。 sizeof(Example)告訴你,這個類需要多少個字節。

3.指針e如何解引用函數fun()或fun2()?

這取決於該方法是否是虛擬方法。如果不是它被編譯,就像它是一個常規函數一樣,除了指向this的指針也被傳遞(如果我沒有錯誤,在寄存器中)。

對於虛擬功能和#4中看到here