無虛繼承的空類佔乙個位元組,用於標記該類。有虛繼承的空類至少佔4個位元組(可能繼承的空類佔很大空間)。
對齊情況
class x;
sizeof(x)=24
class y;
sizeof(y)=8
class z;
sizeof(y)=16
1.data member的繫結
有兩種情況:
情況一:在類的函式裡面返回的變數,之前是全域性變數,但如今已經是類的變數。例如:
extern float x;
class point3d
void x(float new_x) const
//...
float x,y,z;
};早期的防禦措施:
把所有成員宣告放在類的開頭。
把所有的inline函式都放在class宣告之外。
情況二:成員函式的引數列表中,當他們第一次出現的時候就適當的被決議resolved完成。
typedef int length;
class point3d
length mumble()
//...
typedef float length;
float _val;
};2.data member的布局
可以用下面模板函式測試布局的先後
template
char* access_order(data_type1 class_type::*mem1,data_type2 class_type::*mem2)
class concrete2:public concrete1
如果把bit2放在bit1的padding域裡面,如果concrete1 *p1;concrete2 *p2=*p1;時,bit2被亂覆蓋掉了。
加上多型時,資料成員可能在虛指標的上面也可能在虛指標的下面。
多重繼承,要適當地調整位置才可以賦值。如
class point2d;
class point3d:public point2d;
class vertex;
class vertex3d:public point3d,public vertex;
vertex3d v3d;vertex *pv;point2d *p2d;point3d *p3d;
對於下面的賦值
pv=&v3d;//考慮到pv3d可能為0,加上偏移,需要轉換為pv=pv3d?vertex *)(((char*)&v3d)+sizeof(point3d)):0;
p2d=&v3d;p3d=&v3d;//直接拷貝位址就可以了。
虛擬繼承有兩種實現:1、每個派生類多加乙個指標指向乙個虛擬基類表2、在virtual中放置virtual base class的offset,正值則索引到函式,負值則索引到基類。
第三章 Data語意學
1 關於data member的繫結 對於memner function的本體分析,會直到整個class的宣告都出現了才才開始。因此乙個inline member function軀體內的乙個data member的繫結操作,會在整個class宣告之後才發生。但是,對於member function...
《深度探索C 物件模型》第三章 Data語意學
首先給出以下例子 y,z的記憶體大小受三個因素的影響 1.語言本身造成的額外負擔,指的是虛繼承中在類中會產生乙個指向虛表的指標,這個指標在32位的系統下是4個位元組。2.編譯器對特殊情況提供的優化處理。3.alignment限制。class a的大小由以下幾點決定 1.被共享的 class x,為1...
深度探索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 主要原因 為了保持每乙個類生成物件在記憶...