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

C++ 對象佈局與多態實現探索:虛繼承的代價與機制

     編輯:關於C++

虛繼承對象佈局

struct C010 { C010():c_(0x01){} void foo(){c_=0x02;} char c_; };
struct C020 : public virtual C010 { C020():c_(0x02){} char c_; };

對象大小 6 字節,佈局:[vptr(4)][C020::c_(1)][C010::c_(1)]。基類成員被放到最後,vptr 指向一個「偏移值指針」結構:前 4 字節保留,後 4 字節存儲從派生類起始到虛基類起始的偏移量(此例為 5)。

訪問虛基類成員的開銷

匯編顯示:c020.C010::c_ = 0x04 需:

  1. 讀取 vptr 值。
  2. 取 vptr+4 處的偏移量(5)。
  3. 用 對象起始地址 + 偏移量 定位基類成員。

結論:虛繼承下訪問基類普通成員效率極低,應盡量避免在虛基類放置非靜態數據成員。

指針向上轉換的複雜調整

C010 * pt = &c020;

匯編 11 條指令:檢查非空 → 讀取偏移值指針 → 計算新指針值。對比普通指針賦值僅 3 條指令。虛繼承下指針轉換極其低效,應在熱點代碼避免此類轉換。

設計建議

  • 必要時才用虛繼承(解決菱形問題)。
  • 虛基類最好不含非靜態數據成員。
  • 避免在性能敏感路徑進行虛基類指針/引用轉換。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved