c++對象內存佈局學習筆記(一)

目的

對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.cppCBase pBase;行,運行程序。在開始調試之前我們需要設置一下gdb的調試輸出,方便我們查看:

  1. set print object on
  2. set print vtbl on
  3. set print pretty on
    再輸入r開始運行,如下:
    在這裏插入圖片描述運行到斷點處,使用p pBaseprint)查看示例對象的信息:
    在這裏插入圖片描述
    pBase示例對象包含有虛表指針_vptr.CBase,地址爲:0x7fffffffde10
    輸入info vtbl pBase查看示例對象pBase的虛函數表內容:
    在這裏插入圖片描述
    CBase的虛表中包含有三個虛函數的指針,分別對應的是[0],[1],[2]

若使用微軟的編譯工具則看的更加明顯:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章