《深度探索C 物件模型》第三章 Data語意學

2021-07-28 06:44:15 字數 1548 閱讀 6999

首先給出以下例子:

y,z的記憶體大小受三個因素的影響:

1.語言本身造成的額外負擔,指的是虛繼承中在類中會產生乙個指向虛表的指標,這個指標在32位的系統下是4個位元組。

2.編譯器對特殊情況提供的優化處理。

3.alignment限制。

class a的大小由以下幾點決定

1.被共享的 class x,為1位元組。

2.class y的大小,要減去因virtual base class x而配置的大小,結果是4bit,z同理,y+z=8。

3.class a自身是0位元組。

4.class a的記憶體對齊,8+1=9位元組,要調整為4的邊界,需要補充3個位元組,所以結果是12個位元組。

data member的布局

static data members只有乙個實體,存放在程式的data segment中,每次程式取用static member,都會被內部轉化為對該唯一的extern實體的直接參考操作。

origin.chunksize=50

;//等價於這個

point3d::chunksize=50

;

若取乙個static data member的位址,會得到乙個指向其資料型別的指標,而不是乙個指向其class member 的指標,因為static member並不內含在乙個class object之中。

&point3d::chunksize;

//會得到const int*型別

如何區分乙個」沒有指向任何data member「的指標和乙個指向」第乙個data member「的指標?例如:

float point::*p1=0;

float point::*p2=&point::x;

if(p1==p2)

為了區分p1和p2,每乙個真正的member offset值都要加上1,如果要使用該值來指出乙個member,要先減去1.

指向members的指標的效率問題

為每乙個「member訪問操作」加上一層間接性(經由已經繫結的指標)會使得執行時間多出1倍不止,以「指向member的指標」來訪問資料,再一次幾乎用掉了雙倍的時間,要把「指向member的指標」繫結到class object上,需要額外地把offset減去1.

《深度探索C 物件模型》第三章讀書筆記

看之前的疑問 1.既然基類先於派生類初始化,基類的資料成員與派生類的資料成員是如何放置的?筆記 1.當初始化乙個類時,如果裡面沒有任何成員,那麼大小為1,編譯器這麼做的原因是為了讓每乙個物件都能保證獲得獨一無二的記憶體位址 2.在某些編譯器上,當類中沒有資料成員,但是卻存在虛函式時,那麼一些編譯器 ...

深度探索C 物件模型 第三章 Data 語意學

乙個有趣的問題 下列 類 sizeof大小 class x 1 class y public virtual x 4 or 8 class z public virtual x 4 or 8 class a public y,public z 8 or 12 主要原因 為了保持每乙個類生成物件在記憶...

《深入探索C 物件模型》第三章奇怪語句解釋

在第三章的3.3節有下面這樣一段描述 class point3d point3d origin origin.y 0.0 origin point3d y 1 對於 1 的操作解釋是這樣的 指向data member的指標,其offset值總是被加上1,這樣可以使編譯系統區分出 乙個指向data m...