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

C++ 類別虛擬函式與虛擬繼承佔用空間分析(GCC vs MSVC)

     編輯:關於C++

GCC 行為

  • 虛擬函式:每個含虛擬函式的類別有一個虛擬表指標(vptr),佔 4/8 bytes。
  • 虛擬繼承:每個虛擬基類別額外需要一個虛擬基類別表指標(vbptr),佔 4/8 bytes。
  • 繼承鏈:派生類別繼承基類別的 vptr/vbptr,不重複分配。

程式碼

/* test.cpp
 * Created on: 2014.04.20
 * Author: Spike
 */
#include <iostream>
using namespace std;

class A { char k[5]; public: virtual void aa() {}; };
class B : virtual public A { char j[6]; public: virtual void bb() {}; };
class C : virtual public B { char i[7]; public: virtual void cc() {}; };

int main() {
    cout << "sizeof(A) = " << sizeof(A) << endl; // 12 (5+3 padding + 4 vptr)
    cout << "sizeof(B) = " << sizeof(B) << endl; // 24 (A 12 + 6+2 padding + 4 vbptr)
    cout << "sizeof(C) = " << sizeof(C) << endl; // 36 (B 24 + 7+1 padding + 4 vbptr)
    return 0;
}

GCC 輸出

sizeof(A) = 12
sizeof(B) = 24
sizeof(C) = 36

MSVC 差異

  • 單一虛擬表:所有虛擬函式集中在一個虛擬表,派生類別共用基類別虛擬表指標,不新增 vptr。
  • 虛擬繼承:每個虛擬繼承層級新增虛擬基類別表指標(vbptr)與虛擬表指標,額外 8 bytes/層。

結論

虛擬函式/虛擬繼承的記憶體開銷取決於編譯器實作。GCC 採「每類別一 vptr + 每虛擬基類別一 vbptr」;MSVC 採「單一虛擬表 + 虛擬繼承額外 vbptr/vptr」。設計時勿假設固定大小。

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