論c 中物件的記憶體布局

2021-08-21 21:18:37 字數 904 閱讀 4159

物件的記憶體布局就是計算物件所占用的記憶體大小,物件的大小只包含資料成員,類成員函式是執行**,不屬於物件的資料成員。在不討論類的繼承,以及虛函式的時候。乙個物件的大小的計算公式一般為:

物件的大小 = sizeof(資料成員1) + sizeof(資料成員2) + ... + sizeof(資料成員n)。

但是,即便在這種情況下,仍然有3中特殊情況不滿足這個公式:

1 空類:

空類中沒有任何資料成員。按照公式計算,此類的物件所占用的記憶體空間應該為0.而實際情況是,空類的物件物件長度為1位元組。如果類物件完全不占用記憶體空間,就無法取得例項化物件的位址,this指標失效。而類的定義有成員資料和成員函式組成,在沒有成員資料的情況下,仍可以有成員函式,因此,就為空類分配了1位元組的空間用來例項化類。這1位元組並沒有被使用。

2 靜態資料成員:

靜態的資料成員屬於類,而不屬於類的物件,因此,類物件的大小不包括靜態資料成員。

3 記憶體對齊:

這種情況最為複雜。

為什麼需要記憶體對齊,請參考

對齊規則,請參考

需要補充的是,當類裡面含有巢狀的類成員時,不會將類的整體長度參與到對齊計算中,而是以巢狀定義的結構體所使用的對齊值進行對齊。比如:

#include #pragma pack(8)

using

namespace

std;

class

x ;

class

y ;int

main()

按照對齊規則,類x的大小為8,但是在計算類y的大小時,並不是按類x的大小8參與到對齊計算中。由於類x的整體對齊係數 = min(max(char, char, short), 8) = 2, 所以,應該用類x的整體對齊值2來參與類y的對齊計算,這樣算出來為類y大小為12

C 中物件的記憶體布局(三)

給出這樣的重複繼承 一 直接繼承,沒有虛函式存在時,書寫如下 class ca class cb public ca class cc public ca class cd public cb,public cc 檢視記憶體布局如下 由於b和c都繼承了a,所以在d中重複出現了a中的成員變數,所以當試...

C 物件的記憶體布局

一篇寫的比較好的部落格 這篇文章中主要想說以下幾個問題 1 如何通過物件獲得虛函式表中虛函式的位址 2 分幾種情況討論記憶體布局 1 單一繼承 2 多重繼承 3 重複繼承 4 鑽石虛擬繼承 為了解決重複繼承中出現問題而產生的虛擬繼承 1 虛函式主要是通過一張虛函式的位址表來實現的,簡稱v table...

C 物件的記憶體布局

記憶體布局是屬於較深層次的知識,很多問題往深了講都是不清楚記憶體布局的原理。最近讀到一本書,裡面講了一部分c 物件的記憶體布局,讓我對很多以前的問題都豁然開朗了。書上篇幅較大,我加上自己的理解總結了下。分為三部分 簡單物件,單繼承,多繼承 非靜態成員變數和虛函式是決定類大小的唯一兩個因素 非靜態成員...