C 物件記憶體模型 資料封裝

2021-07-03 04:09:52 字數 756 閱讀 7981



「c++是c的超集」,這句話裡包含了兩個問題:

1. c++相容c;

2. c++在c之上進行了擴充套件;

那c++在c之上進行了哪些擴充套件呢?眾所周知,c++內建了眾多程式設計機制、支援眾多程式設計風格:面向過程、基於物件、物件導向、面向、基於模板、泛型、元程式設計等等。其中,以面向過程、基於物件、物件導向的程式設計機制最為流行。

講到c++的資料封裝和抽象,就不得不提類的成員函式和成員資料:

成員資料

非靜態物件、靜態物件

成員函式

非靜態函式、靜態函式、虛函式

下面,直接上測試**,直觀的看看c++的基本物件記憶體模型。

class 

a{}; //size: 1

class b;

class

c;

class 

d;

virtual void 

print2(){};

};

class 

e;

從測試結果來看,

1. 空類的size為1,應為編譯器自動新增了乙個標記位元組。(size為0就太詭異了!)

2. 靜態資料和靜態函式,配置到物件之外。

3. 非靜態函式,配置到物件之外。

4. 含有虛函式的物件,配置有乙個指向類虛擬表(vtbl)的指標。

5. 純虛物件(介面物件),配置有乙個指向類虛擬表的指標。

C 物件模型 記憶體布局

聯絡人 石虎暱稱 嗡嘛呢叭咪哄 一 概念 1 沒有繼承情況,vptr存放在物件的開始位置,以下是base1的記憶體布局 m idata 100 2.單繼承的情況下,物件只有乙個vptr,它存放在物件的開始位置,派生類子物件在父類子物件的最後面,以下是d1的記憶體布局 b1 m idata 100 b...

C 物件記憶體模型探索

實驗環境 ubuntu 18.04 64 bit gcc 7.3.0 g 7.3.0,編譯使用 m32選項啟用32位環境 實驗步驟 1 不含有虛函式的基類,如下 include class base private int i int main 執行結果 kevin kvm study temp g...

C 物件記憶體模型初探

週末看資料的時候,看到虛繼承和虛函式 兩者完全不是一碼事,正在寫乙個簡單的總結 進一步看到c 的類物件的記憶體模型,網上已有很多文章,自己也記錄一下。研究問題從簡單入手,一步步深入。我們先來看乙個最簡單的模式 class a 用測試程式可以發現,a的物件的大小是4位元組,也就是a int型別 的大小...