http://www.cnblogs.com/cswuyg/archive/2010/08/20/1804111.html 還有很多相關的內存佈局相關文章
C++對象內存佈局--虛基類表的使用
一、測試VS編譯器,虛基類表在函數調用時是怎麼使用的
1、測試代碼:
//虛基類表指針的使用.cpp //2010.8.19 //使用VC++6.0/VS2005/VS2008編譯器編譯,OllyDbg反彙編工具調試查看虛基類表的使用。 #include
<iostream> using namespace std; //////////////////////////////////////////////////////////////// class Base { public : Base( int a
= 10):a(a) { } virtual void show() { cout
<< "Base::show()" <<
endl; } virtual void testA() { cout
<< "Base::testA()" <<
endl; } private : int a; }; //////////////////////////////////////////////////////////////// class BaseA
: virtual public Base { public : BaseA( int b
= 20):b(b) { } virtual void showA() { cout
<< "BaseA::showA()" <<
endl; } void testA() { cout
<< "BaseA::testA()" <<
endl; } private : int b; }; //////////////////////////////////////////////////////////////// class BaseB
: virtual public Base { public : BaseB( int c
= 30):c(c) { } virtual void showB() { cout
<< "BaseB::showB()" <<
endl; } private : int c; }; //////////////////////////////////////////////////////////////// class Derived
: public BaseA,
public BaseB { public : Derived( int d
= 40):d(d) { } virtual void show() { cout
<< "Derived::show()" <<
endl; } virtual void test() { cout
<< "Derived::test()" <<
endl; } private : int d; }; //////////////////////////////////////////////////////////////// int main() { Derived
obj; cout
<< "start" <<
endl; //爲方便反彙編調試設置的標記 Base
*pb = &obj; pb->show(); cout
<< "start" <<
endl; //爲方便反彙編調試設置的標記、 system ( "pause" ); return 0; } |
2、使用OllyDbg反彙編調試的相關結果:
圖 1 VC++6.0編譯器,OD調試結果
圖 2 VS2005/2008編譯器,OD調試結果
3、結果表明,在調用虛基類函數的時候,有使用到虛基類表指針。
二、測試GCC編譯器,虛基類表在函數調用時是怎麼使用的
1、測試代碼跟上邊的一樣。
2、使用OllyDbg反彙編調試的相關結果:
圖 3 GCC編譯器,OD調試結果
3、結果表明,在調用虛基類函數的時候,沒用到虛基類表指針,直接:ADD EAX, 14,獲取虛基類實例地址。可能是測試的代碼比較簡單,編譯器做了優化。