2016-04-17 116 views
13

對於那些使用vtables的編譯器實現:是否有任何情況下虛擬函數表在運行時更改?或者vtable只在編譯時被填充,並且在運行時沒有執行修改它們的操作?在運行時修改Vtable

+2

你設想什麼的運行時類型的修改是有用/可能嗎? –

+2

@ Cheersandhth.-Alf如果它是一個簡單的C++程序比沒有,這是愚蠢的。但如果他(現在或將來)必須寫VM或interperter/JIT編譯器之類的東西,那麼我就不會如此迅速地拋棄他的問題 –

+0

這是imp ...很難想出這樣的設計,線程安全,所以沒有完成。 –

回答

8

我不是利用了虛擬表在運行時更改多態性的實現知悉任何C++ ABI的。無論如何,由於虛擬表通常描述代碼的屬性(成員函數與類層次結構中的每個其他w.r.t.位置的關係),並且C++代碼在運行時不會更改,所以它不會非常有用。

而且因爲它不會有用,這將是浪費。

+0

是否虛函數表走在execurable圖像中的代碼段或數據段? –

+2

@KarolisM ilieška:在哪些實施?你爲什麼需要知道? –

+0

具體:ARM Keil,但這也適用於gcc arm。 1.我只是很好奇,2.我使用嵌入式系統,有時需要知道在哪裏放置某些部分。 –

2

簡短的回答是否定的。

稍微長一點(也可能是特定於實現的)答案是,對象的實際vtable指針在派生多態類的構造函數和析構函數的執行過程中發生變化,因此派生類中的重寫方法無法執行通過基類的構造函數/析構函數,而派生類尚未構造/已被破壞。

如果你希望對象在運行時更改類,那麼你有多種選擇:

  1. 的Objective-C(++)

  2. 手工編寫自己的調度機制

  3. python/javascript等等。

  4. (最好的選擇)重新考慮你的設計。

+1

這不是變化的vtable。這是破壞對象的vptr成員! –

+0

另外,'std :: function'可以在運行時重新分配,所以這是另一個選項 –

+0

@KerrekSB固定,雖然我確定有更好的措辭 –