程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> C++對象模型

C++對象模型

編輯:C++入門知識

C++對象模型內存布局如下: 非靜態數據成員在對象之內靜態數據成員在對象之外靜態、非靜態成員函數在對象之外類中存在虛函數時,一個類對應一個virtual table放在對象之外,對象中安插一個指針vptr指向這個表。 測試例程:

#include 
 
using namespace std;
 
class A {
public:
    int x, y;
    static int s;
    void f1() { }
    static void f2() { }
    virtual void f3() { }
};
int A::s = 123;
 
int main()
{
    cout << "size = " << sizeof(A);
    return 0;
}

運行結果: \ 可以看出,對象所在內存中只包含有整型變量x、y、vptr,其它成員全部存在於對象之外。
下面討論繼承體系下的對象模型。下面這個測試例程有點意思:
#include 
 
using namespace std;
 
class A {
public:
    int x, y;
 
};
 
class B: public A {
};
 
class C: virtual public A {
};
 
int main()
{
    cout << "class B size = " << sizeof(B) << endl;
    cout << "class C size = " << sizeof(C) << endl;
    return 0;
}


運行結果:

類C采用了虛繼承,內部就多了四字節。這是由於虛繼承的特性決定的:在虛擬繼承情況下,基類(虛基類)不管在繼承鏈中被派生多少次,永遠只會存在一個實例。和virtual table類似,也存在一個指針表(virtual base class table),表中每個指針指向一個虛基類地址,在對象中也安插一個指針指向這個表。所以類C才會增加了四字節空間。而在普通繼承中,派生對象把基類對象包裹起來存放一塊連續內存中,每個類都有一份基類對象的實例。
參考: 《深度探索C++對象模型》 P9-P13.

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved