VS2010命令列下檢視虛函式表和類記憶體布局

2021-06-20 20:15:16 字數 1337 閱讀 8973

vs2010命令列下檢視虛函式表和類記憶體布局

——《深度探索c++物件模型》讀書札記系列

在學習多重繼承下的virtual functions時,需要分析派生類的虛函式表(vtable),但是在網上找了好幾種hack vtable方法,結果都不盡如人意。沒想到ms compiler(以vs2010為例)有列印vtable的編譯選項,真是太好了!

1. 開啟「visual studio command prompt (2010)」,如下

該cmd下具有vs2010命令列下的一些編譯、鏈結等工具,例如cl.exe。

2. 編寫乙個cpp檔案

以《深度探索c++物件模型》的160頁的**(160.cpp)為例,如下

[cpp]view plain

copy

print?

class base1 ;  

class base2 ;  

class derived : public base1, public base2 ;  

int main(void)    

class base1 ;

class base2 ;

class derived : public base1, public base2 ;

int main(void)

3、使用cl命令的/d1 reportallclasslayout或reportsingleclasslayout***選項。這裡的reportallclasslayout選項會列印大量相關類的資訊,一般用處不大。而reportsingleclasslayout***選項的***代表要編譯的**中類的名字(這裡***類),列印***類的記憶體布局和虛函式表(如果**中沒有對應的類,則選項無效)。

舉例如下

[plain]view plain

copy

print?

cl /d1 reportsingleclasslayoutbase1 160.cpp  

cl /d1 reportsingleclasslayoutbase1 160.cpp
執行結果下

可以看出base1的大小為8個位元組,共有3個虛函式,分別是~base1、speackclearly和clone,對於學習上述的示例**綽綽有餘咯~~

VS2010命令列編譯 常用命令

cl.exe所在的資料夾裡面有乙個批處理叫做 vsvar32.bat 首先執行它一次,你就可以用cl.exe來編譯你的 了。在vs2005裡面未發現該檔案,懷疑因該是上級目錄的vcvarsall.bat,但是不執行該檔案同樣可進行命令列編譯。cl.exe 是控制 microsoft c 和 c 編譯...

Linux 下檢視命令列歷史

linux中,bash輸入的歷史記錄,會存在.bash history 或者說root bash history 通過history檢視。可以看到,不僅可以輸出正確的命令,還可以輸入錯誤的 如abc 而且輸出的是history之前所有的命令 including history bash histor...

Linux 下檢視命令列歷史

2018年03月26日 09 55 00 v0wsec linux中,bash 輸入的歷史記錄,會存在.bash history 或者說root bash history 通過history檢視。可以看到,不僅可以輸出正確的命令,還可以輸入錯誤的 如abc 而且輸出的是history之前所有的命令 ...