深度探索C 物件模型學習筆記 Data語意學

2021-05-05 14:38:00 字數 906 閱讀 4549

例子:

class x{};

class y: public virtual x {};

class z: public virtual x {};

class a: public y, public z {};

物件大小由下述原因決定

1.語言本身所造成的額外負擔

如:支援virtual base classes時,derived class中,額外負擔反映在某種形式的指標身上,它或者指向virtual base class subobject,或者指向乙個相關**;**中存放的若不是 virtual base class subobject的位址,就是其偏移量。

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

virtual base class x subobject的1bytes大小也出現在class y和z身上。某些編譯器會對empty virtual base class提供特殊支援

3.alignment 限制

一般32位的機器上,alignment是4bytes

vc++編譯器執行結果:sizeof(x)=1, sizefo(y)=4, sizeof(z)=4, sizeof(a)=8

class x被編譯器暗中放置乙個char,使得x的兩個物件得以有獨一無二的記憶體位址

class y,存放乙個指向virtual base class subobject的指標

class z,同classy大小一樣

class a,大家共享的唯一乙個class x實體,大小是1bytes,class a, class b,共9bytes,加上empty virtual base class的優化處理,減去1bytes,就是8bytes,8bytes不用alignment。

指向data members的指標:在vc中,vptr放置在物件的頭部

《深度探索c 物件模型》學習筆記

封裝並未給c 帶來任何的空間或執行期的不良後果,c 在布局和訪問時間上的主要額外負擔由虛擬化引起。包括 1 virtual function機制。用以支援乙個有效率的 執行期繫結 2 virtual base class機制。用以實現 多次出現在繼承體系中的base class,有乙個的單一而被共享...

《深度探索C 物件模型》學習筆記

1.轉型其實是一種編譯器指令,大部分情況下它並不改變乙個指標所含的真正位址,它只影響 被指出之記憶體的大小和內容 的解釋方式.2.global objects的記憶體保證會在程式啟動的時候被清為0,local objects配置於程式的堆疊中,heap objects配置於自由空間中,都不一定會被清...

深度探索c 物件模型學習筆記之物件

在c 中,有兩種資料成員 靜態的和非靜態的,以及三種類成員函式 靜態的 非靜態的和虛函式。已知如下class point宣告 class point 考慮乙個問題,class point在機器中是怎麼表現的呢?簡單物件模型 簡單物件模型,是為了降低c 編譯器的設計複雜度,賠上了空間和執行器的效率而開...