第三章 Data語意學

2022-08-20 21:09:09 字數 1397 閱讀 5216

無虛繼承的空類佔乙個位元組,用於標記該類。有虛繼承的空類至少佔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 主要原因 為了保持每乙個類生成物件在記憶...