by loren zhai
前段時間有人問c++虛函式表儲存在記憶體的什麼位置,下面是除錯的相關資訊。
class ca
;class cb : public ca
;class cd : public cb
;void ca::func_virtual11()
void ca::func_virtual22()
void cb::func_virtual11()
void cb::func_virtual33()
void cd::func_virtual11()
void cd::func_virtual22()
void cd::func_virtual33()
void demo()
72 004010c2 8b07 mov eax,dword ptr [edi]
72 004010c4 8bcf mov ecx,edi
72 004010c6 ff10 call dword ptr [eax]
73 004010c8 8b17 mov edx,dword ptr [edi]
73 004010ca 8bcf mov ecx,edi
73 004010cc ff5204 call dword ptr [edx+4]
75 004010cf 8b06 mov eax,dword ptr [esi]
75 004010d1 8bce mov ecx,esi
75 004010d3 ff10 call dword ptr [eax]
76 004010d5 8b16 mov edx,dword ptr [esi]
76 004010d7 8bce mov ecx,esi
76 004010d9 ff5204 call dword ptr [edx+4]
0:000> ln poi(250e80)
(004070e8) cvirtualclassdemo!cb::`vftable'
0:000> ln poi(250e98)
(004070dc) cvirtualclassdemo!cd::`vftable'
0:000> dds004070dc-0x10
004070cc 00000002
004070d0 0000004d
004070d4 00000000
004070d8 0000b000
004070dc
00401040 cvirtualclassdemo!cd::func_virtual11
004070e0 00401050 cvirtualclassdemo!cd::func_virtual22
004070e4 00401060 cvirtualclassdemo!cd::func_virtual33
004070e800401020 cvirtualclassdemo!cb::func_virtual11
004070ec 00401010 cvirtualclassdemo!ca::func_virtual22
004070f0 00401030 cvirtualclassdemo!cb::func_virtual33
004070f4 00000000
004070f8 ffffffff
004070fc 0040126d cvirtualclassdemo!maincrtstartup+0xc0
0:000> !address 004070dc
usage: image
allocation base: 00400000
base address: 00407000
end address: 00408000
region size: 00001000
type: 01000000 mem_image
state: 00001000 mem_commit
protect: 00000002 page_readonly
1. 虛函式表儲存在唯讀記憶體段中。
2. 具體的虛表內容,在編譯時就決定了整個繼承鏈上v-table的資訊。中間的某個子類,它的v-tabel是整個v-table的乙個子結構。因為包含虛函式的類的資料結構,第乙個dword儲存了v-table的位址,同時這個值是在建立類時確定了。通過上面demo函式的反彙編,就能清楚是如何找到當前虛函式的具體的實現實現函式了。
C 記憶體劃分與虛函式表在記憶體中的位置
一直都不清楚c 的記憶體具體是怎樣劃分的,只知道大致有堆區 棧區 全域性靜態區 常量區等劃分。如果沒記錯的話,好像還有乙個 區。現在的問題是,c 裡的虛函式是借助虛函式表實現的,含有虛函式的類的物件中有乙個指向虛函式的指標 通常是物件前4個位元組 32位 那麼,虛函式表是儲存在記憶體中的哪個部分中呢...
虛函式表的位置
引言 近日 csdn的 c c 語言 版的乙個問題 引 起了我的注意 請問虛函式表放在 我也曾經思考過這個問題,零零散散也有一定的收穫,這次正好趁這個機會把我對這一部分的理解整理一下。首先值得宣告的是,本文的編譯環境是vs2002 winxp。c 標準並沒有對虛函式的實現作出任何的說明,甚至都沒有提...
C 虛函式在記憶體中的實現
首先來一張圖,一目了然 然後把相應的 貼上來 1 classa2 1011class b publica12 1920class c publicb21 後記 1 每個類的一開始都是乙個虛函式指標,這個指標指向乙個虛函式表,表中的每一項都是相應的虛函式的指標。2 類在繼承的時候,乙個子類的開始就是基...