1.虛函式表是全域性共享的元素
,即全域性僅有乙個.
2.虛函式表類似乙個陣列
,類物件中儲存
vptr指標,
指向虛函式表
.即虛函式表不是函式
,不是程式**
,不肯能儲存在**段.
3.虛函式表儲存虛函式的位址
,即虛函式表的元素是指向類成員函式的指標
,而類中虛函式的個數在編譯時期可以確定
,即虛函式表的大小可以確定
,即大小是在編譯時期確定的
,不必動態分配記憶體空間儲存虛函式表
,所以不再堆中.
根據以上特徵
,虛函式表類似於類中靜態成員變數
.靜態成員變數也是全域性共享
,大小確定.
所以我推測虛函式表和靜態成員變數一樣
,存放在全域性資料區.
c/c++
程式所占用的記憶體一共分為五種:
棧區,堆區,
程式**區
,全域性資料區
(靜態區
),文字常量區.
顯而易見
,虛函式表存放在全域性資料區.
幾個值得注意的問題
虛函式表是class specific的,也就是針對乙個類來說的,這裡有點像乙個類裡面的staic成員變數,即它是屬於乙個類所有物件的,不是屬於某乙個物件特有的,是乙個類所有物件共有的。
虛函式表是編譯器來選擇實現的,編譯器的種類不同,可能實現方式不一樣,就像前面我們說的vptr在乙個物件的最前面,但是也有其他實現方式,不過目前gcc 和微軟的編譯器都是將vptr放在物件記憶體布局的最前面。
雖然我們知道vptr指向虛函式表,那麼虛函式表具體存放在記憶體哪個位置呢,雖然這裡我們已經可以得到虛函式表的位址。實際上虛函式指標是在建構函式執行時初始化的,而虛函式表是存放在可執行檔案中的。下面的一篇部落格測試了微軟的編譯器將虛函式表存放在了目標檔案或者可執行檔案的常量段中,
,不過我在gcc下的彙編檔案中沒有找到vtbl的具體存放位置,主要是對可執行檔案的裝載和執行原理還沒有深刻的理解,相信不久有了這些知識之後會很輕鬆的找到虛函式表到底存放在目標檔案的哪乙個段中。
經過測試,在gcc編譯器的實現中虛函式表vtable存放在可執行檔案的唯讀資料段.rodata中。
虛函式表vtable在linux/unix中存放在可執行檔案的唯讀資料段中(rodata),這與微軟的編譯器將虛函式表存放在常量段存在一些差別。
參考文獻:
1. 2. 深度探索c++物件模型
虛函式表存放位置
引言 近日 csdn的 c c 語言 版的乙個問題 引起了我的注意 請問虛函式表放在 我也曾經思考過這個問題,零零散散也有一定的收穫,這次正好趁這個機會把我對這一部分的理解整理一下。首先值得宣告的是,本文的編譯環境是vs2002 winxp。c 標準並沒有對虛函式的實現作出任何的說明,甚至都沒有提到...
C 虛函式 虛函式表位址
總結自 編譯器 vs2017 一 虛函式 當我們使用基類的引用或者指標呼叫乙個虛成員函式時會執行動態繫結,直到執行時才知道到底呼叫了哪個版本的虛函式,被呼叫的函式是與繫結到指標或者引用上的物件的動態型別相匹配的那乙個。所有虛函式都必須有定義。虛函式的作用主要是實現多型機制。using namespa...
gdb檢視虛函式表 函式位址
1.檢視函式位址 看函式在 的哪一行,使用info line就可以看到類似下面這中輸出 點選 此處 摺疊或開啟 gdb info line a.cpp 10 line 10 of a.cpp starts at address 0x80487d4 zn1b5test2ev and ends at 0...