這篇文章將帶您深入研究c++類的大小問題,學習下來,你可能會發現這根本就是一門新的語言,想知道其中的內容詳情,一起往下學習吧,你會有新的收獲的。
首先看一個例子:
運行結果為:
?
sizeof(A)=1
sizeof(B)=8
sizeof(C)=4
sizeof(D)=16
對于類A來說,雖然A是一個空類,但為了便于空類進行實例化,編譯器往往會給它分配一個字節,這樣A實例化后便在內存中有了一個獨一無二的地址.對于類B,B的大小應為sizeof(int)+sizeof(char)=5,但是考慮內存對齊,B的大小應為8.對于類C,類的靜態成員變量被放在全局區,和類的普通成員并沒有放在一塊。類的靜態成員被聲明后就已存在,而非靜態成員只有類被實例化后才存在。所以C的大小為sizeof(int)=4。D的大小為B+C的大小+自身數據成員的大小,一共為16.
?
==========================分割線在這里====================================
下面討論含有虛函數的類的大?。?/p>
運行結果為:
?
sizeof(A)=4
sizeof(B)=4
sizeof(C)=8
sizeof(D)=12
對于class A,它含有一個虛函數,編譯器會為虛函數生成一張虛函數表,來記錄對應的函數地址,為此,在class A的內存地址中要有一個vfptr_A指針指向這個虛表,所以class A的大小為指針大小,即4.(注意,無論類中有多少個虛函數,它們的大小都是4,因為內存中只需要保存這個指針即可)。
對于class B,它是public繼承A,雖然它也有一個虛函數,但是從結果看,B應該和A都在B的vtable(虛表中),所以class B的大小為4.
對于class C,它是vitual 繼承A,所以要有一個指向父類A的指針,占有4字節大小aa()是繼承自class A的虛函數,從結果來看,它沒有在內存中占有空間,所以C的大小為sizeof(A)+4=8.
對于class D,它是虛繼承class A,同上,要有一個指向父類A的指針,同時,class D中有虛函數,所以要有一個指向虛表的指針,所以sizeof(D)=sizeof(A)+4+4=12
以上就是武林小編帶來的深入研究c++類的大小,想必都已有了一定的了解,更多關于C++的內容請繼續關注武林技術頻道。
新聞熱點
疑難解答
圖片精選