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

2021-06-23 05:10:48 字數 2388 閱讀 8687

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

這個選項就是/d1reportsingleclasslayout。

具體使用方法如下,在寫好相應的cpp檔案之後,需要啟動vs2008的命令列工具「visual studio 2008 command prompt」,切換到cpp檔案所在目錄之後,輸入如下的命令:

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。

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

最後加一句,我並不支援這種非要深入研究物件記憶體布局的行為,再說這種布局完全是由編譯器決定的,gcc的記憶體布局很可能就完全不同。這個對提高c++水平並沒有多大的益處。點到為止。

**:

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

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

vs2008命令列編譯C C 程式

一 命令列下執行 建立 visual c 原始檔並在命令列上對其進行編譯 開啟 visual studio 2008 命令提示 視窗。單擊 開始 按鈕,指向 所有程式 指向 microsoft visual studio 2008 指向 visual studio 工具 然後單擊 visual st...

vs2008命令視窗使用

vs2008命令視窗用的很少,命令 視窗用於直接在 visual studio 整合開發環境 ide 中執行命令或別名。可以執行選單命令和不在任何選單上顯示的命令,不過有些命令還是挺方便的。命令名 別名 完整名稱 1.列印 debug.print 2.快速監視 debug.quickwatch 3....