簡體   English   中英

C ++ vptr在每個對象中都是重復的

[英]C++ vptr is duplicated in every object

在c ++中,我們在每個對象中都有VPTR,但每個類只有一個VTABLE。 為什么VPTR在每個對象中? 不是重復嗎?

如果你有:

class base
{
   virtual void func() = 0; 
}

class a: public base
{
 public:
   virtual void func() { cout << "a" << endl; }
}

class b: public  base
{
 public:
   virtual void func() { cout << "b" << endl; }
}


void call_func(base *x)
{
    x->func();
}

int main()
{
    vector<base *> v;

    v.push_back(new b);
    v.push_back(new a);

    for(int i = 0; i < v.size(); i++)
        call_func(v[i]);
}

“call_func”如何知道要調用哪個func

事實證明它使用vtable(vptr)來查找要調用的func

[是的,代碼是一個巨大的內存泄漏 - 我試圖保持簡單]

內存中的C ++對象實例如何引用其VTABLE? 但是,VPTR-VTABLE是編譯器特定的實現,C ++標准沒有說明它。 通常,它是多態類實例的第一個(隱藏)成員。

它帶來了成本,因為有這樣的隱藏成員使得C ++內存模型與C不兼容。它是一種開銷,既定的,但沒有其他(更好的)方法從內存中的C ++對象實例引用VTABLE。

沒有運行時類型信息,您不知道對象所在的類。因此,為了調用方法,您需要存儲類信息,然后使用它來查找要調用的正確vtable。 將指針放入每個對象更容易(也更直接)。

首先,標准沒有保證這一點,你需要談論一個特定的編譯器來獲得具體的答案。

動態綁定適用於對象級別。 一個類從不以多態方式使用,一個對象是。 因此,您需要弄清楚某個函數如何基於每個對象進行綁定。

該指針是識別對象類型的唯一方法。 每個對象都必須有一個。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM