VS使用命令列選項檢視物件的記憶體布局

2021-06-29 00:50:31 字數 2280 閱讀 9261

微軟的visual studio 2008(vs2008)提供了乙個新的選項,給使用者顯示c++物件在記憶體中的布局。

這個選項就是/d1reportsingleclasslayout。

具體使用方法如下,在寫好相應的cpp檔案之後,需要啟動vs2008的命令列工具「visual studio 2008 command prompt」,(在工具下面:visual stdio命令提示)

切換到cpp檔案所在目錄之後(cd命令),輸入如下的命令:

cl [filename].cpp /d1reportsingleclasslayout[classname]

cl當然就是ms的編譯器咯;[filename].cpp就是你所想要檢視的class所在的cpp檔案(class定義在標頭檔案也沒關係,還是只要編譯cpp檔案即可);而你需要在最後加上[classname],也就是你需要檢視的class的類名。

【舉例】

test.cpp檔案**如下:

#include 

using namespace

std;

class

base;};

class derived : public

base

;private

:int

d;void

fcn3()

};int main(void) 

我想檢視derived這個類的物件在記憶體中的布局,那麼就可以用下面的命令列。

cl test.cpp /d1reportsingleclasslayoutderived

結果顯示如下:

可以看到class derived的物件的記憶體布局,在派生類物件的開始包含了基類base的物件,其中有乙個虛表指標,指向的就是下面的derived::$vftable@ (virtual function table),表中包含了derived類中所有的虛函式。

【再舉一例】

下面是乙個經典的虛繼承的菱形繼承結構的**:

#include 

using namespace

std;

class

base;};

class derived1 : public

base;};

class derived2 : public

base;};

class child : virtual public derived1, virtual public

derived2

;};int main(void) 

其對應的顯示結果則如下:

其中表示虛繼承的虛基類指標。然後這個child類其實有三個虛函式表指標(圖中的三個),下面則分別給出了虛基類指標和三個虛函式表指標的具體內容。其中的那些負數表示這些指標舉例物件起始位置的offset。

*********************************************

虛繼承1) **:

#include 

<

iostream

>

using

namespace

std;

class

bvoid

fb()

};class

d1 : 

virtual

public

bvoid

fd1()

};class

d2 : 

virtual

public

bvirtual

void

vd2()

void

fd2()

};class

gd :  

public

d1, 

public

d2void

vd1()

virtual

void

vgd()

void

fgd()};

2)類圖:

3)vs2008的編譯選項檢視布局:

VS2008使用命令列選項檢視物件的記憶體布局

微軟的visual studio 2008 vs2008 提供了乙個新的選項,給使用者顯示c 物件在記憶體中的布局。這個選項就是 d1reportsingleclasslayout。具體使用方法如下,在寫好相應的cpp檔案之後,需要啟動vs2008的命令列工具 visual studio 2008 ...

使用命令列編譯vs專案

有時候我們想要編寫打包指令碼,但是如何編譯vs解決方案呢,其實vs已經給我們提供了乙個命令列工具devenv.exe,以vs2019為例 它在common7 ide 下 構建devenv.exe 解決方案的路徑 build project projname projectconfig projcon...

gcc的常用命令行選項

gcc的常用命令行選項 選項 說明 o file 指定輸出檔名,在編譯為目標 時,這一選項不 是必須的.如果file沒有指定,預設檔名時a.out c 只編譯不鏈結 dfoo bar 在命令列定義預處理巨集foo,其值為bar idirname 將dirname加入到包含檔案的搜尋目錄列表中 ldi...