[英]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.