首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

深度探索 C++ 對象模型:記憶體佈局與虛擬機制基礎(上)

     編輯:關於C++

C++ 物件模型核心架構

在 Stroustrup 設計的 C++ 物件模型中:

  • Nonstatic data members:配置於每個 class object 內部。
  • Static data members:儲存於所有 class object 之外(全域區)。
  • Static / Nonstatic function members:同樣置於 object 之外。
  • Virtual functions:透過兩階段機制支援:
    1. 每個類別產生一張虛擬函數表,存放虛擬函數位址。
    2. 每個 class object 內嵌一個 vptr,指向對應的 vtable。vptr 的設定/重置由建構子、解構子、複製指派運算子自動完成。

型別資訊物件 通常置於 vtable 第一個槽位,支援 RTTI。

虛擬繼承

指定繼承為 virtual 表示共享基類子物件。無論在繼承鏈中被派生多少次,虛擬基類永遠只存在一個實體。例如 iostream 僅包含一個 ios 子物件。

指標型別與物件切割

指標型別的意義

指標型別教導編譯器如何解讀記憶體內容與大小。以 32 位元機為例:

  • int* 存取 4 bytes。
  • ZooAnimal* 涵蓋 vptr (4) + int loc (4) + String name (8) = 16 bytes。

派生類別指標與基類指標雖指向同一起始位址,但涵蓋範圍不同。基類指標僅能存取基類子物件成員,除非透過虛擬機制。

物件切割與編譯器仲裁

Bear b;
ZooAnimal za = b; // 切割發生
za.rotate();      // 呼叫 ZooAnimal::rotate()

切割導致 za 純粹為 ZooAnimal,其 vptr 指向 ZooAnimal 的虛擬表。編譯器在初始化與指派操作中仲裁,確保含有 vptr 的物件不會被基類操作改寫 vptr。

面向對象 vs. 基於對象

基於對象(OB)提供封裝但無多態與型別擴充。優點:函數呼叫編譯期解析、無 vptr 開銷,速度較快、空間較緊湊。缺點:彈性較低。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved