目的
對c++對象的內存佈局有點迷糊,學習之中簡單記錄一下,以便複習查閱。
環境:
g++:g++ (Ubuntu 8.3.0-16ubuntu3~16.04) 8.3.0
一. 示例1
存在一個類,包含有三個虛函數,分別打印不同的字符串。在main.cpp
函數中定義一個類的示例對象,通過分析示例對象的信息,達到學習的目的。
#include <iostream>
using namespace std;
// 定義一個基類
class CBase
{
public:
virtual void f1() const { cout << "f1" << endl; }
virtual void f2() const { cout << "f2" << endl; }
virtual void f3() const { cout << "f3" << endl; }
};
// 調用函數
int main()
{
cout << "定義一個基類b" << endl;
CBase pBase;
return 0;
}
編譯腳本:
CC=g++
CXXFLAGS=-std=c++11 -g
OBJ=main.o
SRC=
edit:main.o
$(CC) $(CXXFLAGS) -o main $(OBJ)
main.o:$(SRC)
$(CC) $(CXXFLAGS) -c main.cpp
.PHONY:clean
clean:
rm -rf main $(OBJ)
編譯啓動調試,斷點到main.cpp
的CBase pBase;
行,運行程序。在開始調試之前我們需要設置一下gdb的調試輸出,方便我們查看:
set print object on
set print vtbl on
set print pretty on
再輸入r
開始運行,如下:
運行到斷點處,使用p pBase
(print
)查看示例對象的信息:
pBase示例對象包含有虛表指針_vptr.CBase
,地址爲:0x7fffffffde10
輸入info vtbl pBase
查看示例對象pBase
的虛函數表內容:
CBase的虛表中包含有三個虛函數的指針,分別對應的是[0],[1],[2]
若使用微軟的編譯工具則看的更加明顯: