微軟的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...