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,擷取虛基類執行個體地址。可能是測試的代碼比較簡單,編譯器做了最佳化。